错误:“新”不能出现在常量表达式中

时间:2018-07-06 09:26:58

标签: c++

class A
{
    int data;

public:
        void display()
        {
            cout<<"Value is "<<data;
        }
        void set_data(int x)
        {
            this->data = x;
        }
        A object = new A();
};

运行上面的代码时,出现错误,指出“新的表达式不能出现在常量表达式中”。为什么会这样?

4 个答案:

答案 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
}