2010-12-04 4 views
10

私は、次のコード例にまで私の問題を低減しました:エラー生成デフォルトコンストラクタは

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n); 
}; 

MewTwo::MewTwo(int n) {} 

no matching function for call to ‘pokemon::pokemon()’

は私がが起こっていると考えは、ということです存在しないMewTwoコンストラクタを書き込もうとすると、pokemonのデフォルトのコンストラクタが呼び出されます。私はC++には比較的新しいので、ここでは推測しています。何か案は?

制限:修正は、パブリックメンバーを変更したりクラスに追加することはできません。

答えて

13

は実際に何を求めているのメンバ初期化リストです。継承したクラスコンストラクターを次のように変更します。

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) : pokemon(n) {} 
}; 

あなたは何が起こっていたのかを識別するのに間違いありませんでした。基本的に、継承されたクラスを作成するときは、最初に基本クラスを作成します。デフォルトのコンストラクターが定義されていないため、基本クラスを作成することはできません。メンバーの初期化リストは、あなたがそれを回避するのに役立ちます:)

チェックアウト:http://www.cprogramming.com/tutorial/initialization-lists-c++.htmlもっと多くの例があります!

+1

私はメンバーの初期化リストについて聞いたことがありません。 :) – Coltin

5

これを試してみてください:

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) :pokemon(n){} 
}; 
+4

+1。基本クラスとメンバーは、派生クラスのコンストラクターコードが実行される前に初期化されます。この目的でデフォルトのコンストラクタを使用したくない場合は、使用するコンストラクタと渡すパラメータを指定する必要があります。これは、示されているように、初期化リストで行われます。基本クラスでは、コンストラクタを定義しました。コンストラクタは、デフォルトのコンストラクタの作成を抑制します。 –

関連する問題