1

私はコンストラクターが大まかにこれを行うクラスを持っています:

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
  }
}

デフォルトのコンストラクターがある限り、これは正常に機能するはずBです。C

私の問題はそうでBはないのでb、初期化リストで初期化する必要があります。しかし、d計算する前にbビルドする必要があるため、これは問題cです。

1つの方法は次のとおりです。

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

しかし、 a の構築にDは (非常に) コストがかかります (*)

この問題を回避するクリーンな方法は何ですか?


(*) これに関する別の問題は、 ifbcを同じインスタンスから構築する必要があることです ( ifDのコンストラクターがランダム化されている場合など)。しかし、それは私の場合ではありません。

4

1 に答える 1

4

C++11 では、委譲コンストラクターを使用できます。

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)
    {
    }
};
于 2013-03-01T14:21:30.577 に答える