在堆栈上分配对象时的C ++继承错误

时间:2012-07-10 15:13:53

标签: c++ inheritance object

  

可能重复:
  Why is it an error to use an empty set of brackets to call a constructor with no arguments?

我的代码示例很小:

#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();

为什么在堆栈上分配对象时它不起作用?

2 个答案:

答案 0 :(得分:9)

因为B b();声明了一个名为b的函数,它返回B。只需使用B b;并指责C ++有一个复杂的语法,使这种结构变得棘手。

答案 1 :(得分:4)

B b();声明一个名为b的函数,它不带任何内容并返回B。奇怪?尝试将您的班级B重命名为Int,并将您的“对象”命名为f。现在看起来像

Int f();

看起来更像是一个功能,不是吗?

要定义默认构造的对象,您需要:

B b;

如果是operator new,可以使用或不使用括号调用默认构造函数:

B* b = new B;
B* b = new B();