我创建了一个名为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);
没有显示错误。
请帮助我如何摆脱错误。
答案 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();