getNode():
Node<type> getNode(int position) {
Node<type> *item = head;
for (int i = 0; i < position; ++i) {
item = item->next;
}
return *item;
};
节点交换代码:
Node<Guitar*> temp;
temp.element = list.getNode(l).element;
temp.next = list.getNode(l).next;
list.getNode(l).element = list.getNode(h).element;
list.getNode(l).next = list.getNode(h).next;
list.getNode(h).element = temp.element;
list.getNode(h).next = temp.next;
我正在为我的计算机科学课程开展一个项目,这项课程将在几天内完成。我想使用quicksort对链表进行排序,这很简单,但在列表中交换节点时我一直在努力解决一个奇怪的问题。作为参考,getNode()函数返回列表中某个索引处的节点,并且节点保存指向吉他对象的指针以及下一个节点指针。我现在已经进行了几个小时的实验,我想出了这样的行,“list.getNode(h).element = temp.element;”说的是指向列表中节点中吉他对象的指针被赋予临时对象中指针的值。这通常会起作用,但此时我得到一个错误,说左侧不是可修改的左值。但是,我可以创建一个指针并将其放在赋值运算符的左侧,没有任何错误。此外,当我在前面使用解除引用运算符(*)时,左侧没有错误,但这不能成功交换节点。我一定错过了什么。
答案 0 :(得分:2)
函数的返回类型应该是引用类型 - 否则您告诉编译器从您返回的值复制构造对象,并将其用作返回值。
我写了一个例子,可以找到here。为了简单起见,它构造了一个向量传入get函数的向量,它返回一个指向其中一个组件对象的解引用指针。如果你检查程序的输出,它会愉快地通知你它是构造值的副本,而不是引用它 - 你对从getNode
函数“检索”的节点所做的任何更改都将是从你想要的节点复制构造的节点。
我怀疑这也是为什么你会遇到不可修改左值的问题,因为你试图为临时变量赋值。
TL; DR:
您的getNode
函数正在返回一个临时对象。让它返回一个参考。