从类指针到int的无效转换

时间:2018-09-26 14:42:45

标签: c++

我无法在下面的代码中找出问题所在

class Node
{
    private:
        int index, value;

    public:
        Node(int index=0, int value=0):index(index),value(value){}

        int getIndex()
        {
            return index;
        }

        int getValue()
        {
            return value;
        }
};


int main()
{
    Node n = new Node(10,10);
    return 0;
}

我知道

  

从Node *到int的无效转换

3 个答案:

答案 0 :(得分:4)

new返回一个指针。您无法为n分配指针,它是Node。快速解决方法是将有问题的行更改为Node * n = new Node(10,10);auto n = new Node(10,10);

然而,使用new 不再是现代c ++中动态创建对象的推荐解决方案。请改用auto n = std::make_unique<Node>(10, 10);,以使n成为smart pointer。通过使用智能指针,您不必手动跟踪所有权,也不必记住只delete次对象。如果发生意外异常,还可以使代码更健壮。您需要#include <memory>。参见std::make_uniquestd::make_shared

#include <memory>

int main()
{
    auto n = std::make_unique<Node>(10,10);
    return 0;
}

尽管在这种情况下,似乎不需要动态分配。只需使用Node n{10, 10};就足够了。

答案 1 :(得分:2)

如果要在堆栈上

Node n(10, 10);

将在堆栈上创建对象。它在函数末尾甚至在函数结束之前就超出范围(例如,如果它是在循环中声明的)。

如果要在堆上

Node *n = new Node(10, 10);

对象在堆上分配,并且指向它的指针在堆栈上。 Java的“引用”具有更多您期望的行为。当指针超出范围时,将不会删除该对象。相反,delete必须在某个时刻被调用,否则内存将被泄漏(与Java的“引用”不同,后者是垃圾回收)。

答案 2 :(得分:1)

使用新参数时,需要使用一个指针。线

Node n = new Node(10,10);

应该是

Node* n = new Node(10,10);

错误消息是因为从new返回的值是内存中的数字位置,而编译器知道代表它的最接近的数据类型是int。