【问题标题】:Assigning to a pointer returned by a function call分配给函数调用返回的指针
【发布时间】:2011-09-14 16:26:50
【问题描述】:

我正在尝试实现一个简单的 LinkedList 以下代码,产生此错误:

error: lvalue required as left operand of assignment

该行是:

newNode->getNext() = _head;

getNext() 返回一个Node*,我试图在更新之前使新的Node 指向当前头部。 我可能在思考 Java 并且做错了转换。

【问题讨论】:

  • 没有你的实现它只是猜测......
  • 避免在变量名中使用前导下划线,因为它们是为编译器使用而保留的。您可能会踩到某些东西,只花一周的时间调试就可以发现。早期预防:选择不同的命名约定,例如下划线作为后缀。
  • @Thomas:仅当它在全局命名空间中,或者下划线后跟一个大写字母或另一个下划线时。

标签: c++ pointers linked-list variable-assignment


【解决方案1】:

由于您正在实现该类,因此您有多种选择:

  1. 实现setNext(Node*)方法(可能是private)并使用newNode.setNext(_head)
  2. 直接分配给节点的_next成员:newNode._next = _head
  3. 让Node的构造函数将_next的初始值作为参数,在构造newNode时传递_head

由于您没有发布您的代码,我猜测了“next”指针的名称并将其命名为_next。此外,上述 1-3 点并不相互排斥,也不是唯一的可能性。

附:如果您不确定“左值”和“右值”的含义,请查看 C FAQ

【讨论】:

    【解决方案2】:

    要么,取消引用:

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

    (假设_head 具有Node 类型,并且赋值运算符在Node 中小心实现)或者,可能更好

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

    但无论如何,这不是你应该这样做的方式。你可能想要实现一个 setter。

    另外,您是否考虑过使用std::list 而不是重新发明轮子?

    【讨论】:

    • 我选择了第二个。 _next 是 Node* 类型,所以我必须返回 *_next 才能使其工作。但我不明白为什么需要这样。
    【解决方案3】:

    您需要将分配给的变量放在“=”符号的左侧。

    _head = newNode->getNext();

    再读一遍,并没有真正达到你想要的效果。我建议实现一个将节点作为参数的“setNext”函数,或者直接访问“next”变量。 newNode.next = _head;例如。

    【讨论】:

      【解决方案4】:

      您在左侧放置了一个函数调用,这是您无法做到的。你确定你不是故意的……

      _head = newNode->getNext();
      

      【讨论】:

      • 或 newNode->setNext(_head); (不确定这是否有效,但你明白了)
      • 假设存在这样的功能,是的。
      • 回复:“您正在将函数的返回值设置为 _head,您确实无法做到这一点。”没有理由断定这里不能这样做。
      • @John So..你是说在左边有一个函数是完全合法的?不管你在说什么,把答案改写得更清楚。
      • @MGZero:只要函数调用表达式的结果是lvalue(而不是rvalue),就可以。大约只有在函数返回引用时才会发生这种情况。 ([n3290: 3.10/1]: "[..] 再比如,调用返回类型为左值引用的函数的结果是左值。[..]")
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2011-10-26
      • 2015-02-05
      • 2010-09-30
      相关资源
      最近更新 更多