以下代码可能会帮助你理解我的问题,我使用的是一个节点类和一个列表类。下面是错误。[Error] lvalue required as left operand of assignment. 任何帮助将被感激...!
class Node{
private:
int data;
Node* next;
public:
void SetNext(Node* next){
this->next=next;
}
void SetData(int data){
this->data=data;
}
Node* GetNext(){
return next;
}
int GetData(){
return data;
}
};
class List{
private:
Node *CurrentLocation;
public:
List(){
CurrentLocation=NULL;
}
void SortList(){
Node *t1,*t2;
int temp;
for(t1=CurrentLocation;t1!=NULL;t1=t1->GetNext()){
for(t2=CurrentLocation;t2!=NULL;t2=t2->GetNext()){
if(t2->GetData()>t1->GetNext()->GetData()){
temp=t2->GetData();
t2->GetData()=t2->GetNext()->GetData();
t2->GetNext()->GetData()=temp;
}
}
}
}
};
你正试图将数据分配给一个 rvalue
.这 rvalue
是你的数据的临时副本,不是原始数据。一旦表达式执行,它就会被销毁,因此 u 不能对它进行赋值。
要分配给你的数据,u必须返回一个对它的引用,如下图所示
int& GetData(){
return data;
}
正如用户4581301所提到的,我建议你看看这个。什么是rvalues、lvalues、xvalues、glvalues和prvalues?
前面的描述是关于问题本身的,但最好是像你的getter那样为你的数据写一个setter,如下所示
void setData(int newData){
data = newData;
}
这里是问题线。
t2->GetData()=t2->GetNext()->GetData();
问题是GetData()函数返回的是成员数据的副本,而这个数据没有本地存储(你没有把它分配给一个命名变量,因此它是一个r值)。编译器抱怨的原因是,这实际上什么也没做。你给一个临时值赋了一个新的值,而这个值在这行执行后马上就会消失。
将成员函数转换为
int& GetData(){
return data;
}
意思是当你呼叫 t2->GetData()
指的是 data
成员 t2
并不是临时就能消失的。
不过说真的,可能只是让你更好地 data
公共成员变量,所以你可以直接从它那里设置itread
这一行是有问题的。
t2->GetData()=t2->GetNext()->GetData();
你是想把一个值赋给... data
int。然而 GetData
成员函数不返回 data
本身:is 会返回一个临时副本。你不能赋值到临时文件中。为了过于简化,编译器将临时文件调用为 rvalue
和非临时性的,如 lvalue
. 赋值需要l值,因为如果赋值到时态里,意义不大。
最好的办法是使用setter函数来设置值。
t2->SetData(t2->GetNext()->GetData());
在这里,setter将赋值到 data
数据成员。