我无法在下面的代码中找出问题所在
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的无效转换
答案 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_unique
和std::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。