问题
Suppose I want to pass a temporary object into a function. Is there a way to do that in 1 line of code vs. 2, with a struct?
With a class, I can do:
class_func(TestClass(5, 7));
given:
class TestClass
{
private:
int a;
short b;
public:
TestClass(int a_a, short a_b) : a(a_a), b(a_b)
{
}
int A() const
{
return a;
}
short B() const
{
return b;
}
};
void class_func(const TestClass & a_class)
{
printf("%d %d\n", a_class.A(), a_class.B());
}
Now, how do I do that with a struct? The closest I've got is:
test_struct new_struct = { 5, 7 };
struct_func(new_struct);
given:
struct test_struct
{
int a;
short b;
};
void struct_func(const test_struct & a_struct)
{
printf("%d %d\n", a_struct.a, a_struct.b);
}
The object is more simple, but I wonder if there's a way to do the struct member initialization right in line with the function call, without giving the struct a constructor. (I don't want a constructor. The whole reason I'm using a struct is to avoid the boilerplate get/set class conventions in this isolated case.)
回答1:
An alternative to providing a constructor in your struct, would be to provide a make_xxx free function:
struct Point {int x; int y;};
Point makePoint(int x, int y) {Point p = {x, y}; return p;}
plot(makePoint(12, 34));
One reason why you might want to avoid constructors in structs is to allow brace-initialization in arrays of structs:
// Not allowed when constructor is defined
const Point points[] = {{12,34}, {23,45}, {34,56}};
vs
const Point points[] = {Point(12,34), Point(23,45), Point(34,56)};
回答2:
This is possible in the C++11 standard. Basically, you are able to do this:
struct_func(test_struct{5, 7});
This is already available in GCC as of version 4.4.
回答3:
You can do it the same way as you do with the class. Just give your struct a constructor and you can create it inline just like the struct. Your objections about using a constructor are unfounded. The primary difference between a class and a struct is the default visibility associated with it. For classes, it's private; for structs, public. There's no "boilerplate," and you don't have to obey any "conventions" that you don't want to.
struct test_struct
{
int a;
short b;
test_struct(int a_, int b_): a(a_), b(b_) { }
};
struct_func(test_struct(5, 7));
回答4:
I'm not c++ expert, but couldn't you just place the creation statement inside the argument list of your function call?
回答5:
Structs can also have constructors, so you can do the same thing with them you do with the class example.
来源:https://stackoverflow.com/questions/2212354/simple-way-to-pass-temporary-struct-by-value-in-c