假设我有一个A类没有默认构造,返回类型A的对象的工厂方法factoryA,并具有作为其成员的类B中。 我知道,在这种情况下,B的A类成员在B的构造函数初始化列表中被初始化。 这是不完全清楚,我为什么那么,如果有人可以解释,对我来说将是巨大的。 此外,如果需要B的构造函数内进行计算的参数A的构造函数,通过查询性质的数据库或者说点什么? 有没有办法使用下面的设置,但不提供一个默认的构造函数的方法吗? 提前致谢。
class A {
private:
int _i;
public:
A(int i) : _i(i) {}
};
A factoryA(bool b) {
if(b)
return A(1);
else return A(2);
}
class B {
private:
A _a;
public:
B(int j) {
if(j > 0)
_a = factoryA(true);
else _a = factoryA(false);
}
};
成员对象的构造函数的进入体(大括号之间的部分)之前总是初始化。 如果你不提在初始化列表中的成员,它就会被默认的构造。 所以,别提了!
B::B(int j) : _a(factoryA(0 < j)) { };
这将调用函数factoryA
与参数值true
如果j
大于0和false
,否则,并初始化成员_a
与该调用返回的值。
这是不完全清楚,我为什么那么,如果有人可以解释,对我来说将是巨大的。
对于类[*],所述_a = factoryA(true);
行调用_a.operator=(factoryA(true))
调用一个成员函数_a
需要_a
已被初始化。 所以,如果它不是一个编译时错误,它仍然是无效的。
此外,如果需要B的构造函数内进行计算的参数A的构造函数,通过查询性质的数据库或者说点什么? 有没有办法使用下面的设置,但不提供一个默认的构造函数的方法吗?
只要A
有复制或移动构造函数,你可以用一个函数的返回值初始化它,该功能可以做任何你想要的,即使使用不同的构造为A
根据提供的参数。
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);
}
[*]我知道,也有例外。
在这种情况下,最好使用指针A,即A * _a,然后调用构造函数,无论你想。