class A
{
int data;
public:
void display()
{
cout<<"Value is "<<data;
}
void set_data(int x)
{
this->data = x;
}
A object = new A();
};
运行上面的代码时,出现错误,指出“新的表达式不能出现在常量表达式中”。为什么会这样?
答案 0 :(得分:2)
运算符new返回一个指针,但是A
不是指针类型。您要A*
:
A* object = new A();
您还希望将以上statement移到班级正文之外,并将其放入适当的函数中,例如main()
:
int main() {
A* p = new A();
// do work
delete p;
}
话虽如此,您根本不需要指针,而您可以简单地使用具有自动存储持续时间的对象:
A object;
或者您想考虑使用智能指针,例如std::unique_ptr:
std::unique_ptr<A> p = std::make_unique<A>();
答案 1 :(得分:1)
class A
{
public:
A * object = new A(); // In any case not: "A object = new A();"
};
或者:
class A
{
public:
A object;
};
-
请参阅(让我们暂时假设您没有收到错误),在这两种情况下,在第一个A对象的构造上,它都会创建另一个A对象作为数据成员。这个A数据成员(我们称其为object.object)依次创建另一个A作为其数据成员(我们称其为object.object.object),从而无限期(或直到没有更多内存)。我的意思是,作为数据成员,它既不能为A* object = new A();
,也不能为A object;
-
我不确定您的意图是什么,但是如果您要将一个A对象链接到另一个A对象,则该类应该是这样的:
class A
{
public:
A * object = nullptr
};
答案 2 :(得分:0)
您必须将A类的对象放入 main()。
void main(){
A object;
}
答案 3 :(得分:0)
首先,您不能在类声明中创建对象。类声明就像类的蓝图。就是说这些是我班的组成部分-变量和成员函数。您无法实例化其中的任何内容,因为在此阶段没有分配内存。
请注意,您可以在成员函数之一(包括构造函数)中实例化一个对象。这些在分配内存时在对象创建期间调用。
即使在构造函数中使用此语句,当构造函数调用其构造函数时,也会陷入无限循环,依此类推,直到内存溢出为止。
您可以像这样在main中声明对象:
int main() {
A obj = new A();
//other operations
} //Object A is destroyed once you come out of main.
或者像这样动态地
int main() {
A* obj = new A(); //dynamic allocation
//other operations
delete obj; //explicitly destroy
}