2016-07-06 22 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に構成していないためです。 YXから継承しているため、X部分をYの部分に構成する必要があります。あなたはコンパイラがあなたのためにそれをしなかったので。これを行うと、デフォルトのコンストラクタが使用されます。このコンストラクタには、Xには含まれていないため、エラーが発生します。あなたはYX一部とYxメンバーを構築するため

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

のようなものを持っている必要があります。または、Xのデフォルトのコンストラクタを追加して、デフォルトのコンストラクタを作成させることもできます。

8

デフォルトコンストラクタが利用できないため、あなたは、スーパークラスのコンストラクタを呼び出す必要があります:

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

はまた、X::X(int)マーキング考えますexplicit

関連する問題