1

获取节点():

    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;

我正在为我的计算机科学课做一个项目,几天后就到期了。我想使用相当简单的快速排序对链接列表进行排序,但是在交换列表中的节点时我一直在努力解决一个奇怪的问题。作为参考,getNode() 函数返回列表中某个索引处的节点,这些节点包含指向吉他对象的指针以及下一个节点指针。我已经试验了几个小时,我发现像这样的行,“list.getNode(h).element = temp.element;” 是说指向列表中节点中吉他对象的指针被分配了临时对象中指针的值。这通常可以工作,但此时我收到一个错误,指出左侧不是可修改的左值。但是,我可以创建一个指针并将其放在赋值运算符的左侧,而不会出现任何错误。另外,当我在前面使用解引用运算符(*)时,左侧没有错误,但这并没有成功交换节点。我肯定错过了什么。

4

1 回答 1

2

你的函数的返回类型应该是一个引用类型——否则你告诉编译器从你返回的值复制构造一个对象,并将它用作返回值。

我写了一个例子,可以在这里找到。为简单起见,它构造了一个向量以传递给getting 函数,该函数返回一个指向组件对象之一的解引用指针。如果您检查程序的输出,它会愉快地通知您它是在复制构造值,而不是获取对它的引用——您对从getNode函数中“检索”的节点所做的任何更改都将被复制到节点副本- 从您想要的节点构造。

我怀疑这也是您遇到不可修改左值问题的原因,因为您试图将值分配给临时变量。

tl; dr:
您的getNode函数正在返回一个临时对象。让它返回一个引用,而不是。

于 2015-05-14T01:20:52.483 回答