0

このコードをチェックしてください:

#include <vector>
class A
{
public:
    A(int a, int b);
};

class C :public A
{
public:
    C(int a, int b):A(a,b){}
    static C instances;
};

C C::instances;

int main()
{
    return 1;
}

コンパイルすると、次のようなエラーが発生します。

$ c ++ inheritance.cpp
継承.cpp:16:6:エラー:「C :: C()」の呼び出しに一致する関数がありません
継承.cpp:16:6:注:候補は次のとおりです。
継承.cpp:12:2:注:C :: C(int、int)
継承.cpp:12:2:注:候補者は2つの引数を期待し、0が提供されます
継承.cpp:8:7:注:C :: C(const C&)
継承.cpp:8:7:注:候補者は1つの引数を期待し、0が提供されます

Aから継承するにはCが必要であり、コンストラクターに引数を含めるにはAが必要です。最後に、インスタンスの静的変数を引数なしで宣言および定義する必要があります。それで、それに対する解決策はありますか?私はあなたの親切なコメントを大切にします。

注意すべきもう1つのポイント:静的変数がコンテナの場合、次のようになります。

static std::vectorインスタンス;

コードは問題なくコンパイルされます。なんで?

編集:

すべての回答に感謝しますが、変更C C::instances;するC C::instances(0,0);と別のエラーが発生します:$ c ++ inheritance.cpp /tmp/cctw6l67.o:関数C::C(int, int)': inheritance.cpp:(.text._ZN1CC2Eii[_ZN1CC5Eii]+0x1b): undefined reference toA :: A(int、int)'collect2:ldが1つの終了ステータスを返しました

なぜですか?そしてそれを修正する方法は?

ありがとう

4

4 に答える 4

4

コンストラクターを定義すると、コンパイラーはデフォルトのコンストラクターを生成しなくなり、それを で呼び出そうとしますC C::instances;。利用可能なコンストラクターを呼び出すことで、これをバイパスできます。

C C::instances(0,0);

または のデフォルト コンストラクタを提供しますC

static std::vector<C> instances;

要素が作成されないためコンパイルされ、std::vector空のベクターを初期化するデフォルトのコンストラクターがあります。しかし

C::instances.push_back(C());

コンパイルしません。

于 2012-06-15T07:19:57.983 に答える
1

最初の質問について: 行以降、このエラーが発生しています

C C::instances;

C引数を取らないコンストラクタ (つまり)を呼び出そうとしますC::C()。これを修正するには、2 つのデフォルト値C::C()で呼び出すコンストラクターを導入するかA::A(int, int)、既存のコンストラクターにデフォルト値を指定します。

C::C(int a = 0, int b = 0) : A(a, b) {}

2 番目の質問について: astd::vectorにはデフォルトのコンストラクターがあります。

于 2012-06-15T07:21:43.253 に答える
1

オブジェクトを構築しC C::instances;ているため、そのコンストラクターを呼び出します。

コンストラクターに 2 つの引数を指定C(int a, int b)したため、既定のコンストラクター (何も必要としない) は自動的に生成されなくなりました。そのため、2 つのパラメーターを使用してインスタンスを作成するか、C C::instances(0, 0)代わりに C 用の追加のデフォルト コンストラクターを提供する必要があります。

C() : A(0, 0)
{
}
于 2012-06-15T07:20:51.857 に答える
1

C C::instances;

これはデフォルトのコンストラクターを呼び出そうとしますが、コンストラクターを提供したため、コンパイラーはコンストラクターを提供しません。

class Aデフォルトのコンストラクターをandに追加しますclass C

class A
{
public:
   A(int a, int b);
   A() {}  // implement default constructor
 };

//class C
 class C :public A
 {
 public :

    C(int a, int b):A(a,b){}
     C() {} // default constructor
     static C instances;
  };

static std::vector instances;

std::vectorデフォルトのコンストラクターがあるため、これは機能します。

于 2012-06-15T07:28:27.643 に答える