问题描述
class Node{
private:
int value;
Node *next;
public:
Node(int aValue){
value = aValue;
cout<< "Node created: " << value <<endl;
}
void setValue(int newValue){
value = newValue;
}
int getValue(){
return value;
}
void setNext(Node node){
next = &node;
}
Node nextNode(){
return *next;
}
};
int main (){
Node nodeA(29);
Node nodeB(3);
Node nodeC(56);
Node nodeD(72);
Node nodeE(69);
nodeA.setNext(nodeB);
nodeB.setNext(nodeC);
nodeC.setNext(nodeD);
nodeD.setNext(nodeE);
cout<< nodeA.nextNode().getValue();
}
解决方法
链接列表方法应使用 pointers 。查看您的setNext
void setNext(Node node){
next = &node;
}
如您所见,这存储了node参数的地址,这与main中的node对象的地址不同。而且由于setNext
方法退出后,节点参数不再存在,因此您最终存储了无效的地址。
改为尝试
void setNext(Node* node){
next = node;
}
Node* nextNode(){
return next;
}
int main()
{
...
nodeA.setNext(&nodeB);
nodeB.setNext(&nodeC);
nodeC.setNext(&nodeD);
nodeD.setNext(&nodeE);
cout<< nodeA.nextNode()->getValue();
}
,
您的代码具有未定义的行为。
void setNext(Node node){
next = &node;
}
您存储本地node
的地址。一旦此函数返回node
不再存在,并且next
是一个悬空指针。稍后在nextNode
中取消引用无效指针将导致未定义的行为。
设置“下一个”后,您在哪里更新值?
做什么
void setNext(Node* node){
next = node;
value = node->value;
}
int getValue(){
return next->value;
}