0

比較的深いクラス階層構造を記述しようとしているのですが、コンパイラが「[ベース クラスのデフォルト コンストラクタ] の呼び出しに一致する関数がありません」とスローし続けます。シナリオは次のとおりです。

Class A {
    A(int);//note, no default constructor
}

Class B : public A {
    B(int i, int j) : A(i), someMemberVariable(j) {}
    int someMemberVariable;
}

Class C : public B {
    C(int k, int l) : B(k, l) {}
}

コンパイラは、クラス C のコンストラクターの行に「A::A() の呼び出しに一致する関数がありません」というエラーをスローし、A::A(int) を使用するように指示します。

クラス A のデフォルトのコンストラクターがなく、サブクラスをサブクラス化しようとするとコンパイラーが混乱することを理解しています。しかし、私が理解していないのはその理由です。まさにそれを避けるために、初期化リストを使用しました。2 レベルの深さのクラスのみを使用すると問題なく動作しますが、3 番目のクラスでエラーが発生します。ここで何が間違っていますか?

4

1 に答える 1

3

人々がコメントしたように、コンストラクターを公開する必要があるだけで、コードにはフォーマットの問題がありました。

class A 
{
  public:
    A(int a) : blah(a) {}; //note, no default constructor
    int blah;
};

class B : public A 
{
  public:
    B(int i, int j) : A(i), someMemberVariable(j) {}
    int someMemberVariable;
};

class C : public B 
{
  public:
    C(int k, int l) : B(k, l) {}
};

int main( void )
{
  C c(5,4);
  return 0;
}

このコードはきれいにコンパイルされ、必要なことを実行します。

于 2013-05-09T18:01:29.553 に答える