Присвоение указателю, возвращенному вызовом функции - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь реализовать простой LinkedList Следующий код, выдающий эту ошибку:

error: lvalue required as left operand of assignment

Строка:

newNode->getNext() = _head;

Где getNext() возвращает Node*, и я пытаюсь создать новую точку Node на текущей голове перед обновлением. Я, наверное, думаю на Java и делаю переход неправильно.

Ответы [ 4 ]

4 голосов
/ 14 сентября 2011

Поскольку вы реализуете класс, у вас есть несколько вариантов:

  1. реализовать метод setNext(Node*) (возможно, private) и использовать newNode.setNext(_head);
  2. assignнепосредственно к _next члену узла: newNode._next = _head;
  3. заставляет конструкторы узла принимать начальное значение _next в качестве аргумента и передавать _head при построении newNode.

Поскольку вы не опубликовали свой код, я предположил имя указателя «следующий» и назвал его _next.Кроме того, пункты 1-3 выше не являются взаимоисключающими и не единственными возможностями.

PS Посмотрите на C FAQ , если вы не уверены, что такое "lvalue" и "rvalue "среднее.

2 голосов
/ 14 сентября 2011

Либо, разыменование:

Node* Node::getNext();
*(newNode->getNext()) = _head;

(при условии, что _head имеет тип Node и оператор присваивания был реализован с осторожностью в Node), или, что лучше

Node& Node::getNext();
newNode->getNext() = _head;

Но в любом случае, это не так, как вы должны делать это.Возможно, вы захотите внедрить установщик.

Кроме того, вы рассматривали возможность использования std::list вместо повторного изобретения колеса?

0 голосов
/ 14 сентября 2011

Вам нужно, чтобы переменная, которую вы назначаете, находилась слева от знака '='.

_head = newNode->getNext();

После прочтения снова не получаетсято, что ты хочешь.Я бы порекомендовал реализовать функцию setNext, которая принимает узел в качестве аргумента, или просто получить прямой доступ к переменной next.newNode.next = _head;например.

0 голосов
/ 14 сентября 2011

Вы размещаете вызов функции на левой стороне, что вы действительно не можете сделать.Вы уверены, что не имели в виду ...

_head = newNode->getNext();
...