组合的实现 - 避免初始值设定项列表

Implementation of composition - avoiding initializer list

本文关键字:列表 实现 组合      更新时间:2023-10-16

我喜欢在类A和B之间做一个组合 - 比如说,类B有一个类型为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) {}
};