使用中间结果初始化多个属性

时间:2013-03-01 14:17:18

标签: c++ constructor initialization

我有一个类,其构造函数大致如下:

class B;
class C;
class D;  

class A{
private:
  B b;
  C c;

public:
  A(istream& input){
    D d(input) // Build a D based on input
    b = B(d);  // Use that D to build b
    c = C(d);  // and c
  }
}
只要BC具有默认构造函数,

就可以正常工作。

我的问题是B没有,所以我需要在初始化列表中初始化b。 但这是一个问题,因为我需要在计算db之前构建c

一种方式是:

A(istream& input):b(D(input)),c(D(input)){}

但构建D(非常)代价高昂(*)

解决此问题的方法是什么?


(*)另一个问题是,如果bc需要从同一个实例构建(如果D的构造函数是随机的,或者其他什么)。但这不是我的情况。

1 个答案:

答案 0 :(得分:4)

在C ++ 11中,您可以使用delegating constructors

class B;
class C;
class D;

class A
{
private:

    B b;
    C c;

public:

    explicit A(istream& input)
        :
        A(D(input))
    {
    }

    // If you wish, you could make this protected or private
    explicit A(D const& d)
        :
        b(d),
        c(d)
    {
    }
};