C ++错误:lvalue需要作为一元'&'操作数

时间:2015-05-12 10:07:36

标签: c++ class lvalue

我创建了一个名为node的类。它的定义如下:

class node
{
    private:
        int key;
        node * next;

    public:
        void setkey(int key);
        void setnext(node * next);
        int getkey();
        node * getnext();
};

这些函数是基本的getter和setter函数。 现在,如果我尝试这样做:

MoveNode(&(bTail->getnext()),&start);

它显示错误:lvalue需要作为一元'&'操作数

现在,如果我更新类Node并将(node * next)保持为public并通过此访问:

MoveNode(&(bTail->next),&start);

没有显示错误。

请帮助我如何摆脱错误。

3 个答案:

答案 0 :(得分:2)

当您从node*返回getnext()时,您创建了一个node*类型的临时变量,因此使用&来获取其地址毫无意义无论如何,变量很快就会被销毁。

当您直接访问next时,您会引用一个长期存在的变量,并且可以获取其地址。

您可能希望从node*向<{1}}返回引用

getnext()

这样它就会指向同一个变量node*& getnext() {return next;}; ,您就可以获取其地址。

答案 1 :(得分:1)

MoveNode(&(bTail->getnext()),&start);
  

它显示错误为:左值作为一元&#39;&amp;&#39;操作数

当然可以。 getnext返回临时值(指针的副本),临时值是rvalues。 Rvalues没有相关的内存地址,因此您不能将它们用作&的操作数。

MoveNode(&(bTail->next),&start);
  

没有显示错误。

好吧,bTail->next 是一个左值,因此没有语法错误。

如果你需要将MoveNode指针传递给指针,那么指向指针的指针必须存储在某处。由于它是作为node中的成员存储的,因此您可以返回引用而不是指针的副本,在这种情况下,您将返回左值并且您的语法是正确的。< / p>

答案 2 :(得分:0)

MoveNode(&(bTail->getnext()),&start);

这不起作用,因为您正在尝试获取getnext返回的临时指针的地址。指针可以是临时的这一事实起初可能听起来很奇怪,但实质上你并没有得到指向节点存储其next指针的位置的指针,而是指向一些无意义的内存位置。

如果您真的希望&(bTail->getnext())返回该节点中next的地址,请使getnext返回对该指针的引用:

node *& getnext();