2016-07-06 4 views
0

У меня есть приложение с базовым и производным классом. Мне нужно иметь подачу базового класса в производном, но есть некоторые проблемы с его инициализацией. Вот код:нет подходящей функции для вызова «X :: X()»

#include <iostream> 
using namespace std; 

class X 
{ 
public : 
    X(int x) { } 
} ; 

class Y : public X 
{ 
    X x ; 
    Y* y ; 
    Y(int a) : x(a) { } 
} ; 

int main() 
{ 
    return 0; 
} 

И ошибки:

/tmp/test.cpp||In constructor ‘Y::Y(int)’:| 
/tmp/test.cpp|14|error: no matching function for call to ‘X::X()’| 
/tmp/test.cpp|14|note: candidates are:| 
/tmp/test.cpp|7|note: X::X(int)| 
/tmp/test.cpp|7|note: candidate expects 1 argument, 0 provided| 
/tmp/test.cpp|4|note: X::X(const X&)| 
/tmp/test.cpp|4|note: candidate expects 1 argument, 0 provided| 
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 

ответ

5

Причина ошибки заключается в том, что вы не строите X часть Y. Поскольку Y наследуется от X, вам необходимо построить часть X от Y. Поскольку вы этого не сделали, компилятор сделает это за вас. Когда он делает это, он использует конструктор по умолчанию, которого нет у X, таким образом вы получаете ошибку. Вы должны иметь что-то вроде

Y(int a) : X(some_value), x(a) { } 

Чтобы построить X часть Y и x члена Y. Или вы можете добавить конструктор по умолчанию для X и создать его по умолчанию.

8

Вам нужно вызвать конструктор суперкласса, поскольку конструктор по умолчанию не доступно:

Y(int a) : X(some_int_like_maybe_a), x(a) { } 

Также рассмотреть маркировку X::X(int), как explicit.