可能重复:
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();
为什么在堆栈上分配对象时它不起作用?
答案 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();