【问题标题】:Implementation of composition - avoiding initializer list组合的实现——避免初始化列表
【发布时间】:2019-08-27 20:00:18
【问题描述】:

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

【问题讨论】:

  • 根据“必要步骤”是什么,您可以将它们提取到静态函数中,返回 w 或 A 的实例。第二个可能是 A 的构造函数。顺便说一句:不要分配指向对象的指针!

标签: c++ list composition initializer


【解决方案1】:

使用委托构造函数:

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

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

【讨论】:

  • 谢谢你,我将使用它。唯一的缺点是需要添加一个额外的成员函数(例如 compute_w() )。不过,有时这可能会带来更好的可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2015-04-15
相关资源
最近更新 更多