Constructors for structs that don't do anything
c++, constructor, struct
Solution
It depends on what the struct is being used for. As others have said, the constructor means that the class is no longer a POD, and that aggregate initialization cannot be used for it. In particular, you cannot have something at namespace scope like:
TwoValues const table[] =
{
{ 1, 2 },
{ 3, 4 },
// ...
};
You can have:
TwoValues const table[] =
{
TwoValues( 1, 2 ),
TwoValues( 3, 4 ),
// ...
};
but it is more verbose, and it implies dynamic initialization, which may result in order of initialization issues.
On the other hand, without the constructor, you cannot create temporary instances on the fly. Instead of:
extern void f( TwoValues const& );
// ...
f( TwoValues( 1, 2 ) );
you have to write:
extern void f( TwoValues const& );
// ...
TwoValues tmp = { 1, 2 };
f( tmp );
If the object is dynamically allocated, it's even worse, since you either have to allocate first, then initialize, or create a temporary as above, and then write `new TwoValues( tmp )` and use the implicit copy constructor.
You have to choose. Depending on what the struct is used for, one or the other will be preferred; on one hand, I have a lot of structs which are used exclusively in static tables, and intentionally don't have a constructor (and contain only types which support static initialization), and use them a lot for configuring code. On the other hand, I also have a lot of structs which are internal to a class, along the lines of `Node` in a tree or a graph; these almost always have a constructor, to facilitate creating them on the fly. There's no "correct" answer without knowing the role of the struct in your application.
Problem
Edit: Just to be clear, the struct doesn't do anything, as in it has no functions. I think I gave the impression that I thought using an initialiser list and leaving the body of the constructor empty was the issue at hand. Say I'm using a struct to hold two values, and I have a constructor just so I can create an arbitrary struct like this: ``` struct twoValues { int x; int y; twoValues(int x_, int y_):y(y_),x(x_) {} }; someFunction(twoValues(1,2)); ``` That saves me from having to do this: ``` twoValues anInstance; anInstance.x=1; anInstance.y=2; someFunction(anInstance); ``` Edit: You're all correct, I could also initialise with the following: ``` twoValues anInstance = {1,2}; ``` I see nothing wrong with this but I had some feedback from a C++ test and one of the negative feedback marks was "constructors for structs that don't do anything". I had limited contact with the guy testing me and so never asked why. Is it a bad thing and why? I would rather carry on doing it.