从类指针到 int 的转换无效

Invalid conversion from class pointer to int

本文关键字:转换 无效 int 指针      更新时间:2023-10-16

我无法弄清楚下面的代码中的问题是什么

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;
}

我得到

从节点* 到 int 的转换无效

new返回一个指针。你不能给n分配指针,这是一个Node。快速解决方法是将违规行更改为Node * n = new Node(10,10);auto n = new Node(10,10);.

但是,在现代 c++ 中动态创建对象时,不再建议使用new来解决。更喜欢auto n = std::make_unique<Node>(10, 10);,这使n成为一个聪明的指针。通过使用智能指针,您不必手动跟踪所有权,也不必记住只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};就足够了。

如果你想在堆栈上

Node n(10, 10);

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

如果你想把它放在堆上

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

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

使用 new 参数时,需要使用指针。 该行

Node n = new Node(10,10);

应该是

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

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