Указатель рассматривается как неизменяемое значение l в Visual Studio 2013

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;

Я работаю над проектом для своего класса по информатике, и он должен состояться через пару дней. Я хочу отсортировать связанный список, используя быструю сортировку, которая довольно проста, но я боролся со странной проблемой при обмене узлами в списке. Для справки, функция getNode () возвращает узел с определенным индексом в списке, и узлы содержат указатель на объект гитары вместе с указателем следующего узла. Я экспериментировал уже несколько часов и понял, что такая строка: «list.getNode (h) .element = temp.element;» говорит, что указателю на гитарный объект в узле в списке присваивается значение указателя во временном объекте. Обычно это работает, но в этот момент я получаю сообщение о том, что левая сторона не является изменяемым значением lvalue. Однако я мог бы сделать указатель и поместить его в левой части оператора присваивания без каких-либо ошибок. Кроме того, в левой части нет ошибки, когда я использую оператор разыменования (*) впереди, но это не позволяет успешно поменять местами узлы. Я должен что-то упустить.

1

Решение

Тип возврата вашей функции должен быть ссылочным типом — в противном случае вы говорите компилятору скопировать конструкцию объекта из возвращаемого значения и используйте его в качестве возвращаемого значения.

Я написал пример, который можно найти Вот. Он создает вектор для передачи в функцию получения для простоты, которая возвращает разыменованный указатель на один из компонентных объектов. Если вы изучите выходные данные программы, она с радостью сообщит вам, что это копия, создающая значение, а не получающая на нее ссылку — любые изменения, которые вы вносите в узел, «извлеченный» из getNode Функция будет создана для узла, созданного копией из нужного вам узла.

Я подозреваю, что это также является причиной того, что вы получаете проблему с неизменяемыми значениями l, поскольку вы пытаетесь присвоить значения временным переменным.

ТЛ; др:
Ваш getNode функция возвращает временный объект. Вместо этого сделайте так, чтобы он возвращал ссылку.

2

Другие решения


По вопросам рекламы [email protected]