1

IE

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

其中C构造取决于Aand B,所以

  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的构造函数都使用初始化列表来调用 和 的构造A函数B。在第一种情况下,传入了值。在第二种情况下,值是预定义的。在最后一种情况下,这些值是从一个参数中计算出来的。

于 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 回答