2012-07-11 151 views
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; 
}; 

其中C構建取決於AB,所以太多構造參數

  1. C構造必須是以下簽名?

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

  2. 我如何構建C以自然的方式?

+0

你的「自然方式」是什麼意思? – hqt 2012-07-11 04:40:25

+0

@hqt一個漂亮的方式,太多的參數帶來難聞的氣味 – 2012-07-11 05:10:34

回答

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

沒有一個CAL告訴你什麼是自然的方式,這一切都取決於你的設計。

它也許自然在某些情況下有這樣的:

class C { 

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

private: 
    A& m_a; 
    B& m_b; 
} 

,但一切都取決於你的設計

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構造函數。在第一種情況下,值被傳入。在第二種情況下,這些值是預定義的。在最後一種情況下,這些值是從一個參數計算出來的。