12

問題を次のサンプルコードに減らしました。

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

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

MewTwo::MewTwo(int n) {}

エラーが発生します:

'pokemon :: pokemon()'を呼び出すための一致する関数がありません</ p>

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

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

4

2 に答える 2

16

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

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

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

詳細な例については、http : //www.cprogramming.com/tutorial/initialization-lists-c++.html をご覧ください。

于 2010-12-04T05:52:20.297 に答える
7

これを試して :

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

class MewTwo : public pokemon {
    public:
        MewTwo(int n) :pokemon(n){}
};
于 2010-12-04T05:51:49.270 に答える