5

重複の可能性:
空の括弧のセットを使用して引数なしでコンストラクターを呼び出すとエラーになるのはなぜですか?

私は小さなコードサンプルを持っています:

#include <iostream>

using namespace std;

class A
{
  public:

  void print()
  {
     cout << "Hello" << endl;
  }

};

class B: public A
{

  public:

  B() { cout << "Creating B" << endl;}

};


int main()
{

  B b();

  b.print(); // error: request for member ‘print’ in ‘b’, which is of non-class type ‘B ()()’



}

しかし、私が以下のものに変更した場合、それが機能する場合、

B* b = new B();

b->print();

オブジェクトをスタックに割り当てると機能しないのはなぜですか?

4

2 に答える 2

9

を返すB b();という名前の関数を宣言しているためです。C ++には複雑な文法があり、この種の構成をトリッキーにするという事実を使用して非難するだけです。bBB b;

于 2012-07-10T15:15:12.450 に答える
4

B b();b何も受け取らずにを返すという名前の関数を宣言しますB。意外?クラスBの名前をに変更しInt、「オブジェクト」に名前を付けてみてくださいf。今では次のようになります

Int f();

関数のように見えますね。

デフォルトで構築されたオブジェクトを定義するには、次のものが必要です。

B b;

の場合operator new、デフォルトのコンストラクターは括弧付きまたは括弧なしで呼び出すことができます。

B* b = new B;
B* b = new B();
于 2012-07-10T15:16:51.863 に答える