2016-07-06 118 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

錯誤的原因是您沒有構建YX部分。由於Y繼承自X您需要構建YX部分。由於你沒有編譯器爲你做。當它這樣做時,它使用默認的構造函數X沒有,因此你會得到錯誤。你需要有像

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

構建的YX部分和Yx成員。或者你可以爲X添加一個默認的構造函數,並讓它獲得默認構造。

8

您需要調用父類的構造函數,因爲默認的構造函數是不可用:

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

還要考慮標記X::X(int)explicit