2014-05-14 3 views
20

저는 C++을 처음 사용합니다. 나는 아래의 코드를 컴파일 할 때이 오류오류 : 기본 클래스 생성자가 부모 클래스 생성자를 명시 적으로 초기화해야합니다.

constructor for 'child' must explicitly initialize the base class 'parent' which does not have a default constructor child::child(int a) {

여기

내 수업

#include<iostream> 
using namespace std; 

class parent 
{ 
public : 
    int x; 
    parent(int a); 
    int getX(); 
}; 

parent::parent(int a) 
{ 
    x = a; 
} 

int parent::getX() 
{ 
    return x; 
} 

class child : public parent 
{ 
public: 
    child(int a); 
}; 

child::child(int a) 
{ 
    x = a; 
} 

int main(int n , char *argv[]) 
{ 

} 

가 왜이 오류를 얻고있다 얻을? 어떻게 해결할 수 있습니까? 미리 감사드립니다.

답변

28

상위 클래스에는 명시 적 생성자가 있으므로 컴파일러에서 암시 적 '빈'생성자를 추가하지 않습니다. 또한 생성자에는 매개 변수가 있으므로 컴파일러에서 암시 적 호출을 생성 할 수 없습니다. 그래서 명시 적으로해야합니다.

이 방법은 : 당신이 파생 클래스의 객체를 초기화하면

child::child(int a) : parent(a) 
{ 
} 
11

, 기본 클래스 부분을 먼저 구축되어야한다. 생성자 중 하나를 호출하여 파생 클래스의 생성자에서 직접 초기화하지 않으면 컴파일러에서 기본 클래스의 기본 생성자를 사용하려고 시도합니다. 귀하의 경우에는 사용자 지정 생성자를 이미 제공했기 때문에 기본 생성자가 정의되지 않았습니다. 오류 메시지가 반복의 위험에

child::child(int a) : parent(a) 
{ 
} 
2

:

당신이 파생 클래스에서 생성자를 기본 클래스의 기본 생성자를 제공하거나 전화를해야 할 것 중 하나 '생성자의 초기화 목록을이 문제를 해결하려면 got : 자식 클래스 생성자가 부모 생성자를 호출해야합니다.

컴파일러는 부모의 기본 (인수없는) 생성자에 대한 자동 호출을 추가합니다. 부모가 기본 생성자를 가지고 있지 않으면, 자신이 가지고있는 생성자 중 하나를 명시 적으로 호출해야합니다.

컴파일러는 자식 클래스가 부모로부터 상속 한 기능이 올바르게 설정되도록하기 위해이를 강제해야합니다. 예를 들어, 자식이 부모로부터 상속했지만 액세스 할 수없는 모든 개인 변수를 초기화하는 경우 직접. 수업에이 문제가 없더라도 규칙을 따라야합니다. 여기

상속하여 클래스의 생성자의 몇 가지 예입니다 :

이 괜찮를 ParentA는 기본 생성자가 있습니다

class ParentA 
{ 
}; 

class ChildA 
{ 
public: 
    ChildA() {} 
}; 

이 잘되지 않습니다; 이 괜찮

class ChildB2 : public ParentB 
{ 
    float m_b; 

public: 
    ChildB2(int a, float b) : ParentB(a), m_b(b) {} 
}; 

, ParentC가 있습니다

class ParentB 
{ 
    int m_a; 

public: 
    ParentB(int a) : m_a(a) {} 
}; 

class ChildB1 : public ParentB 
{ 
    float m_b; 

public: 
    // You'll get an error like this here: 
    // "error: no matching function for call to ‘ParentB::ParentB()’" 
    ChildB1 (float b) : m_b(b) {} 
}; 

이 괜찮습니다, 우리는 명시 적으로 ParentB의 생성자를 호출하고 있습니다 : ChildB1 클래스는 명시 적으로 생성자 자체 중 하나를 호출해야하므로 ParentB는 기본 생성자가 자동으로 호출됩니다 기본 생성자 :

class ParentC 
{ 
    int m_a; 

public: 
    ParentC() : m_a(0) {} 
    ParentC(int a) : m_a(a) {} 
}; 

class ChildC: public ParentC 
{ 
    float m_b; 

public: 
    ChildC(float b) : m_b(b) {} 
}; 
-4

안녕하세요 그때 컴파일하여 부모 클래스에서 (인수가없는 생성자)를 기본 생성자를 추가하지보십시오.희망이 당신의 문제를 해결할 수 있습니다.

+2

이 좋은 해결책이 아니다. 'parent '가 인스턴스화 될 수없는 추상 클래스이지만 괜찮은 클래스일지도 모르겠다. – Rook

1

MyBook 클래스가 Book 클래스에서 파생되는 또 다른 예제입니다. 이제 두 개의 인수가있는 사용자 정의 생성자가 기본 클래스 생성자에 제공되므로 기본 클래스의 기본 생성자가 없습니다. main 함수 내부에서 파생 클래스 객체 소설이 생성되면 컴파일러는 존재하지 않는 기본 클래스 생성자를 호출하려고 시도합니다. 따라서 기본 클래스 생성자를 파생 클래스 생성자에서 명시 적으로 호출하여 파생 클래스가 기본 클래스에서 상속했지만 직접 액세스 할 수없는 전용 변수 (예 : 제목 문자열 변수)를 초기화해야합니다. 사용자 rook이 언급 했으므로 다음 규칙을 따라야합니다. Initialization Lists에 대한 자세한 설명은 Alex Allain으로 자세한 정보를 얻을 수 있습니다. 따라서 정의 된 dafault 생성자가없고 상수 구성원을 초기화 할 때도 초기화 목록이 필요합니다. 그는 부모 클래스 생성자의 바디가 실행되기 전에 생성자의 모든

을 summarises- 다음의 필드는 호출을 위해. 기본적으로 인수가없는 생성자가 호출됩니다. 초기화 목록을 사용하면 에서 호출되는 생성자와 생성자가받는 인수를 선택할 수 있습니다. 당신이 정의되지 않은 상태에서`parent` 인스턴스를 생성 할 수 있기 때문에

#include <iostream> 
#include <cstdio> 

using namespace std; 

class Book { 
private: 
    string title; 
protected: 
    string author; 
public: 
    Book(string t, string a) { 
     title = t; 
     author = a; 
    }; 
    virtual void display() = 0; 
}; 

class MyBook : public Book { 
private: 
     const string className; 
protected: 
     int price; 
public: 
     // Book(t,a) needs to be called before the {} block to initialize, otherwise error (does not match to Book::Book() default constructor will occur)   
     MyBook(string t, string a, int p) : Book(t, a), className("MyClass"), price(p){ 
     }; 

     void display() { 
      cout << "Title: " << getTitle() << endl; 
      cout << "Author: " << author << endl; 
      cout << "Price: " << price << endl; 
     }; 
}; 

int main() { 
    string title, author; 
    int price; 
    getline(cin, title); 
    getline(cin, author); 
    cin >> price; 
    MyBook novel(title, author, price); 
    novel.display(); 

    return 0; 
} 
관련 문제