2011-03-05 4 views
4

클래스 구성을 설정할 때 포함 된 클래스는 기본 생성자를 사용하여 호출 할 수 있지만 매개 변수를 사용하는 클래스는 사용할 수 없습니다.클래스 구성

혼란 스러울 정도입니다. 예를 들어 보겠습니다.

#include "A.h" 
class B 
{ 
private: 
    A legal; // this kind of composition is allowed 
    A illegal(2,2); // this kind is not. 
}; 

기본 생성자와 정수가 2 개인 정수가 모두 있다고 가정하면이 중 하나만 허용됩니다. 왜 이런거야?

답변

8

확실히 허용되지만 다르게 작성해야합니다. 복합 클래스의 생성자에 대해 이니셜 라이저 목록을 사용해야합니다.

#include "A.h" 

class B 
{ 
private: 
    A legal; // this kind of composition is allowed 
    A illegal; // this kind is, too 
public: 
    B(); 
}; 

B::B() : 
    legal(), // optional, because this is the default 
    illegal(2, 2) // now legal 
{ 
} 
+0

A의 경우 생성자가 호출됩니다. 이것은 A에 대한 기본 생성자를 3 번 ​​호출합니다. – heater

+0

@heater : 당신이 무슨 말을하는지 모르겠습니다. 특정 개체의 생성자는 의도적으로 한 번만 호출 할 수 있습니다. (배치가'new'이지만, 아마도 UB의 영역으로 들어가게 될 것입니다.) – Thomas

2

생성자 매개 변수를 제공 할 수 있지만 멤버를 잘못 초기화하고 있습니다.

#include "A.h" 

class B 
{ 
public: 
    B() : x(3), a(2,2) {}; 
private: 
    int x; 
    A a; 
}; 
+0

당신은'A()'가 아니라'B()'라고 써야겠습니까? ;) – Thomas

+0

@ 토마스 : 죄송합니다. :) –

0

클래스 선언은 클래스를 구성하는 구성원을 초기화하지 않습니다

#include "A.h" 

class B 
{ 
private: 
    int x = 3; // you can't do this, either 
    A a(2,2); 
}; 

여기 솔루션의 ctor-initializer입니다. 따라서, 선언 안에서 객체를 constrcut하려고 할 때의 에러.

구성원 초기화는 클래스 생성자 내에서 수행됩니다. 따라서 다음과 같이 작성해야합니다.

#include "A.h" 
class B 
{ 
public: 
    B(); 
private: 
    A a; 
}; 

B::B() : 
    a(2,2) 
{ 
} 
관련 문제