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
构造取决于A
和B
,所以
C
的构造函数必须是以下签名?
C::C(Apar1, Apar2, Apar3, Bpar1, Bpar2, Bpar3)
如何以自然的方式构建C
?
答案 0 :(得分: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(...));
你是否觉得这更自然是一个品味问题,
答案 1 :(得分:2)
C
的构造函数必须初始化m_a
和m_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
的构造函数。在第一种情况下传递值。在第二种情况下,值是预定义的。在最后一种情况下,值是从参数计算的。
答案 2 :(得分:1)
没有人告诉你什么是自然方式,这一切都取决于你的设计。
在某些情况下可能会有类似的东西:
class C {
public:
C(A& a, B& b) : m_a(a), m_b(b) {
}
private:
A& m_a;
B& m_b;
}
但一切都取决于你的设计