1

すなわち

class A {
    public:
    A(Apar1, Apar2, Apar3 /* and so on ... */);
};

class B {
public:
    B(Bpar1, Bpar2, Bpar3 /* and so on ... */);
};

class C {
public:
    // C();
private:
    A m_a;
    B m_b;
};

whereコンストラクトはandにC依存するため、AB

  1. のコンストラクターはC次のシグネチャである必要がありますか?

    C::C(Apar1, Apar2, Apar3, Bpar1, Bpar2, Bpar3)

  2. どうすればC自然に構築できますか?

4

3 に答える 3

4

代わりに、次のようなコンストラクタを作成できます。

class C {
public:
    C (const A &a, const B &b) : m_a(a), m_b(b) {}
private:
    A m_a;
    B m_b;
};

C c(A(...),
    B(...));

これを自然に感じるかどうかは好みの問題ですが、

于 2012-07-11T04:38:30.637 に答える
2

のコンストラクターは、およびをC初期化する必要があります。これは、受け取ったパラメーターを使用して行うことも、使用可能な他の値を使用して行うこともできます。次のコンストラクターを検討してください。m_am_b

C::C(Apar1 a1, Apar2 a2, Apar3 a3, Bpar1 b1, Bpar2 b2, Bpar b3) :
  m_a(a1, a2, a3), m_b(b1, b2, b3) {}
C::C() :
  m_a(6,7,42), m_b("hello", "cruel", "world") {}
C::C(const C& c) :
  m_a(c.m_a.a1, c.m_a.a2, c.m_a.a3), m_b(c.m_b.b1, c.m_b.b2, c.m_b.b3) {}

いずれの場合も、のコンストラクターは初期化子リストを使用しておよびCのコンストラクターを呼び出します。最初のケースでは、値が渡されました。2 番目のケースでは、値が事前定義されていました。最後のケースでは、値は引数から計算されました。AB

于 2012-07-11T04:42:09.447 に答える
1

何が自然な方法かは誰にもわかりません。すべてはあなたのデザイン次第です。

場合によっては、次のようなものを持つのが自然かもしれません。

class C {

public:
  C(A& a, B& b) : m_a(a), m_b(b) {
  }

private:
  A& m_a;
  B& m_b;
}

しかし、すべてはあなたのデザインに依存します

于 2012-07-11T04:39:43.087 に答える