实现组合-避免使用初始化列表

时间:2019-04-05 21:13:32

标签: c++ list composition initializer

我想在类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) ))。 谢谢!

1 个答案:

答案 0 :(得分:1)

使用委派构造函数:

class B{
private:
    A objA;
public:
    B() : B(compute_w()){}

private:
    B(int w) : A(w, w+1) {}
};