C ++中的构造函数参数太多了

时间:2012-07-11 04:34:54

标签: c++ constructor

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构造取决于AB,所以

  1. C的构造函数必须是以下签名?

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

  2. 如何以自然的方式构建C

3 个答案:

答案 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_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的构造函数都使用初始化列表来调用AB的构造函数。在第一种情况下传递值。在第二种情况下,值是预定义的。在最后一种情况下,值是从参数计算的。

答案 2 :(得分:1)

没有人告诉你什么是自然方式,这一切都取决于你的设计。

在某些情况下可能会有类似的东西:

class C {

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

private:
  A& m_a;
  B& m_b;
}

但一切都取决于你的设计