错误:'new'不能出现在常量表达式中

error: 'new' cannot appear in a constant-expression

本文关键字:常量 表达式 不能 new 错误      更新时间:2023-10-16
class A
{
int data;
public:
void display()
{
cout<<"Value is "<<data;
}
void set_data(int x)
{
this->data = x;
}
A object = new A();
};

当我运行上面的代码时,我收到错误,指出"new无法出现在常量表达式中"。为什么会这样?

运算符 new 返回指针,但A不是指针类型。你想要A*

A* object = new A();

您还希望将上述语句移到类主体之外,并将其放入适当的函数中,例如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>();
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
};  

你必须将类 A 的对象变成main((。

void main(){
A object;
}

首先,不能在类声明中创建对象。类声明就像类的蓝图。也就是说,这些是我的类的组件 - 变量和成员函数。您无法实例化其中的任何内容,因为在此阶段不会分配内存。

请注意,您可以在其中一个成员函数(包括构造函数(中实例化对象。这些在对象创建期间分配内存时调用。

即使您在构造函数中使用此语句,当构造函数调用其构造函数时,您也会进入无限循环,依此类推,直到内存溢出。

你可以像这样在 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
}