2012-03-11 4 views
1

오류가 발생합니다. B에 대한 적절한 기본 생성자가 없습니다. 그러나 컴파일러에서 기본 생성자를 호출하는 이유를 이해하지 못합니다. 인수 ii에 전화를 걸고 DONT를 호출하려고합니다. 기본값.상속 : 적절한 기본 생성자를 사용할 수 없습니다.

#include <iostream> 
using namespace std; 

class A { 
    int i; 
public: 
    A(int ii) { i = ii; cout << "Constructor for A\n"; } 
    ~A() { cout << "Destructor for A\n"; } 
    void f() const{} 
}; 

class B { 
    int i; 
public: 
    B(int ii) { i = ii; cout << "Constructor for B\n"; } 
    ~B() { cout << "Destructor for B\n"; } 
    void f() const{} 
}; 

class C:public B { 
    A a; 
public: 
    C() { cout << "Constructor for C\n"; } 
    ~C() { cout << "Destructor for C\n"; } 
    void f() const { 
     a.f(); 
     B::f(); 
    } 
}; 

class D:public B { 
    C c; 
public: 
    D(int ii) { B(ii); cout << "Constructor for D\n"; } 
    ~D() { cout << "Destructor for D\n"; } 
}; 

int main() { 
    D d(47); 
} 

답변

4

부모 생성자는 초기화 목록에서 호출해야합니다

class D:public B { 
    C c; 
public: 
    D(int ii) : B(ii)/* <- */ { cout << "Constructor for D\n"; } 
    ~D() { cout << "Destructor for D\n"; } 
}; 

참고/* < - */코멘트. 그것은 바뀔 필요가 있습니다.

은 당신이 지금하고있는 것은 사용하지 않는 사용자 클래스 D 생성자에서 B()의 인스턴스를 생성하는 것입니다

D(int ii) { B(ii); /* <- useless*/ } 
+0

알았어요. 고마워요. – talha099

+0

C도 B를 상속합니다. –

+0

똑같은 해결책이 맞습니까? – mfontanini

2
D(int ii) { B(ii); cout << "Constructor for D\n"; } 

B의 기본 생성자를 호출합니다. B(ii)은 생성자 D이 리턴하자마자 파손되는 B의 임시 객체를 생성합니다. 즉, 생성되는 객체의 Base 클래스에 대한 생성자를 호출하지 않습니다.

솔루션 :
당신이 Member Initializer list 사용해야합니다 당신의 기본 클래스의 특정 생성자를 호출 할 수 있습니다.

D(int ii) : B(ii) 
{ 
} 
+0

C도 B를 상속받습니다. –

+1

@LuchianGrigore : 같은 문제가있는 것은 당연합니다. OP는 회원 초기 자 목록을 인식하지 못합니다. 답변에서 지적하는 바와 같아요 .OP 주석은 S/He가 여기에있는 답변을 통해 이해할 수 있음을 나타내므로 더 이상 편집 할 필요가 없다고 느낍니다. –

+0

충분히 공정하고, 그냥 지적하십시오. –

1

이 코드 :

class C:public B 
{ 
    C() { cout << "Constructor for C\n"; } 
}; 

시도에 B의 기본 생성자를 호출하십시오.

class C:public B 
{ 
    C() : B(0) { cout << "Constructor for C\n"; } 
}; 

을하지만 당신의 논리에 따라 달라집니다

당신은 할 수 있습니다.

다음

도 잘못 :

D(int ii) { B(ii); cout << "Constructor for D\n"; } 

는 단지하지 않는 임시 객체를 생성 자식 클래스 생성자의 본문에 기본 클래스 생성자를 호출

D(int ii) : B(ii) { cout << "Constructor for D\n"; } 

해야한다 아무것도. 예상대로 동작을 얻으려면이니셜 라이저 목록의 생성자를 호출해야합니다.

1

B에서 파생 된 D를 생성하고 있지만 D의 ctor는 B의 생성자에 매개 변수를 전달하지 않으므로 B에 기본 ctor가 있어야합니다.

는이 문제를 해결하려면, 당신은 일반적으로 B의 ctor에에 매개 변수를 제공하기 위해 D를 작성해야합니다 :

class D : public B { 
    C C; 
public: 
    D(int ii) : B(ii) { cout << "ctor for D\n"; } 
}; 
당신은 그베이스와 멤버 하위 객체를 깨달을 필요가
1

당신이 당신의 생성자의 시체를 입력하는 시간으로 구성된다 !

D(int ii): B(ii) { std::cout << "constructor for D\n"; } 

당신이 D 생성자의 몸에 건설 목적은 단지입니다 : 당신은 당신이 멤버 이니셜 라이저 목록에 인수를 전달할 필요가 기본이없는 기본 또는 구성원이있는 경우 즉, 귀하의 경우에 어떤 목적도 실제로 수행하지 않는 임시 객체 (임시 객체는 경우에 따라 유용 할 수 있습니다).

관련 문제