我喜欢在类A和B之间进行组合 - 比如说,类B有一个类型为A的成员。在初始化这个成员之前,需要一些计算和/或进一步的步骤作为构造函数之一(A类) )需要制定参数。因此,通过初始化列表初始化是不利的。
使其工作的唯一方法是在构造函数/初始化列表(类B)中对类型A的成员进行一些初步初始化,然后在获得参数后在构造函数中进一步向下覆盖此成员。
class A{
private:
int a;
int b;
public:
A(int x, int y): a(x), b(y) {}
}
class B{
private:
A objA;
public:
B(){
// some necessary steps to get say variable int w
objA = new A(w, w+1); // late initialization causes compile error, as
// all members need to be init once entering Ctor
}
我想有一个比前面提到的更优雅的解决方案:双初始化 - 首先在初始化列表中(例如通过B():objA(0,0)),稍后根据需要(A(w,w + 1))。谢谢!
使用委托构造函数:
class B{
private:
A objA;
public:
B() : B(compute_w()){}
private:
B(int w) : A(w, w+1) {}
};