1

クラス宣言の外部のパラメーターを使用してコンストラクターの定義を作成するにはどうすればよいですか?

class A{
 public:
  A(int x);
  ~A();
}

A::A(int x) { ... }
A::~A(){...}


class B : public A
{
 public:
  B(int x):A(x){ this work fine}
  ~B(){}

}

そしてこれは機能しません

class B : public A
{
 public:
  B(int x):A(x); // error here
  ~B();

}

B::B(int x):A(x){ this not work };
B::~B();
4

5 に答える 5

4

この質問は、異常な数の間違った答えを集めているようです(誤解ではなく、おそらく見落としの結果であるように見えるものもあります)。

状況は非常に単純です。クラス定義内には、メンバー関数宣言またはメンバー関数定義のいずれかを含めることができます。クラス定義の外部では、関数定義のみを持つことができます(この場合、クラス定義内では、その関数を宣言するだけで、定義する必要はありません)。つまり、修正されたコードは次のようになります。

class B : public A {  // This is the class definition.
public:
    B(int x);    // declare member functions here.
    ~B();
};

// define member functions here.
//
B::B(int x) : A(x) { /* body */ }
B::~B() { /* body */ }      // a declaration like `B::~B();` is not allowed here.
于 2013-02-05T14:46:10.463 に答える
3

B(int x):A(x); // error here

メソッドの本体を削除しましたが、メンバー初期化リストを削除するのを忘れました:

B(int x); // No error

さらに、クラス定義の最後の閉じ中括弧の後にセミコロンを付ける必要があります。

于 2013-02-05T14:32:18.210 に答える
1

宣言と実装を混ぜ合わせています。そのはず:

class B : public A
{
 public:
  B(int x);
  ~B();    
}

B::B(int x):A(x){ /*this works */ };
B::~B() {}
于 2013-02-05T14:32:27.740 に答える
0

これはあなたのコードです:

class B : public A
{
 public:
  B(int x):A(x); // error here
  ~B();

}

あなたがデストラクタの存在を宣言しているようなことをするとき~B();、しかしあなたがそこにたどり着いたので(「;」に注意してください)、あなたはそれを定義しませんでした。同じことがコンストラクターにも当てはまります。マークした行で、定義であるスーパーコンストラクターを呼び出しましたが、宣言でのみ期待されるメソッド本体を指定していません。

問題を解決するには、BとAの関係を指定せずに、宣言をそのままにしておきますB(int x);。これは、後で定義の後半で指定されます。

スーパーコンストラクターの呼び出しは生成されたコードの一部であり、呼び出し元はそのことを知る必要はありません。そのため、スーパークラスを構築する方法を定義せずにコンストラクターを宣言できます。

于 2013-02-05T14:32:38.307 に答える
0

試す

class B : public A
{
 public:
  B(int x);
  ~B();
};

B::B(int x):A(x){ }
B::~B() {}
于 2013-02-05T14:33:08.793 に答える