Suppose I have a class A without a default constructor, a factory method factoryA that returns an object of type A, and a class B that has A as its member. I know that in th
It is not entirely clear to me why so if someone could explain that to me it would be great.
For classes[*], the _a = factoryA(true);
line calls _a.operator=(factoryA(true))
. Calling a member function on _a
requires _a
to already be initialised. So if it weren't a compile-time error, it still wouldn't be valid.
Also, what if the parameter to A's constructor needs to be computed inside of B's constructor, say by querying a database or something of that nature? Is there a way to use the setup below without providing A with a default constructor?
As long as A
has a copy or move constructor, you can initialise it with a function return value, and that function can do anything you want, even using different constructors for A
depending on the arguments provided.
class B {
private:
A _a;
static A getA(int i);
public:
B(int j) : _a(getA(j)) {
}
};
A B::getA(int j)
{
if (j > 0)
return factoryA(true);
else
return factoryA(false);
}
[*] I know, there are exceptions.
In this case it's better to use the pointer to A, i.e. A* _a, and then call A constructor wherever you want.
Member objects are always initialized before entry into the body (the part between the curly braces) of the constructor. If you don't mention a member in the initializer list, it gets default constructed. So mention it!
B::B(int j) : _a(factoryA(0 < j)) { };
This calls the function factoryA
with the argument value true
if j
is greater than 0 and false
otherwise, and initializes the member _a
with the value returned by that call.