2012-07-11 6 views
1

C 컨스 AB에 따라

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

때문에너무 많은 생성자 파라미터

  1. C 생성자 다음 서명이어야? 자연적인 방법으로

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

  2. 어떻게 구성 할 수
  3. C ?

+0

"자연스러운 방법"이란 의미는 무엇입니까? – hqt

+0

@hqt 예쁜 방법, 너무 많은 매개 변수가 나쁜 냄새를 가져옵니다. –

답변

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

아무도 칼이 무엇인지를 알려 자연스러운 방식으로 디자인에 달려 있습니다.

그것은 어쩌면 자연의 일부 경우에 뭔가가합니다 :

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의 생성자를 호출하는 초기화 목록을 사용합니다. 첫 번째 경우에는 값이 전달되고 두 번째 경우에는 값이 미리 정의됩니다. 마지막 경우 값은 인수로 계산됩니다.