5

継承を使用せずに、この非常に単純なクラスを使用しています。

class A
{
  int a;
  int b;

public:
 A(int x, int y) { a = x; b = y;}
 A() :A(0,0){};
 ~A(){};
} ;

int main ()
{
  A a1, a2(5, 7) ;
}

このエラーが発生します。

エラー C2614: 'A': メンバーの初期化が無効です: 'A' はベースまたはメンバーではありません

SOにも同様の質問がありますが、継承に関連しています。誰かがその理由を説明できますか?標準はそれについて何と言っていますか?

編集:

誰かが転送コンストラクターと C++11 のこの機能について詳しく説明してくれるとよいでしょう。

4

5 に答える 5

5

C++11 を使用できる場合は、A()から初期化できますA(int, int)。これは、2 つの別個のコンストラクターを作成する必要がある C++03 では不可能です。

コードを C++03 で動作させるには、次の 2 つのオプションがあります。

  • 関数init(int, int)を作成し、各コンストラクターから呼び出します。これは、コンストラクターが多くの作業を行う場合に適しています。
  • 両方のコンストラクターで動作が重複しています。これは、メンバーの初期化だけを行う場合に適しています。

子クラスのコンストラクターから基本コンストラクターを呼び出すこともできます。たとえば、

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

あなたは書くことができます

B::B(int x, int y) : A(x,y) {}

A is not a baseこれは、コンパイラがこの状況を予期していると言うときの意味です。

これらはすべて C++03 と互換性があります。

C++11 機能をサポートするようにコンパイラをアップグレードすることもできます。Linux で作業していて、プロジェクトを Windows でコンパイルしたい場合は、これはお勧めしません。Windows コンパイラーは、Linux コンパイラーが行うすべての C++ 機能を実装していないためです (優れたコンパイラーにお金を払わない限り)。

于 2012-10-20T11:45:18.457 に答える
1

これは、次のコンストラクターに関する問題が原因です。

エラー メッセージの外観から、Visual Studio (おそらく 2010) を使用していると思いますが、VS2010 では機能しないことに同意します。

A:A(0,0){ }

VS 2010 とその前身の修正:A():a(0),b(0){}

于 2012-10-20T11:42:16.400 に答える
0

このようにすることはできません。このA() :A(0,0){};方法は、クラスの基本メンバーを初期化するために使用されます。

A(){a=0;b=0;};

private: void set(int x, int y);または、コンストラクターで定義して使用する場合。

于 2012-10-20T11:44:58.080 に答える
0

委譲コンストラクターを使用しようとしています。これは、 でのみ導入された言語機能でありC++11、まだすべてのコンパイラーに実装されていません。

于 2012-10-20T11:45:56.970 に答える
0

A() :A(0,0){}; コンストラクターチェーンと呼ばれます。

コンパイラが C++11 を受け入れていることを確認する必要があります。コンストラクター チェーンは、C++11 でのみ有効です。以前は利用できませんでした。

どのコンパイラを使用していますか?

于 2012-10-20T11:46:46.677 に答える