这是可以帮助您理解我的问题的代码,我正在使用节点类和列表类。这是错误:[错误] 左键需要作为赋值的左操作数。任何帮助将不胜感激..!!
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 必须返回对它的引用,如下所示
int& GetData(){
return data;
}
正如user4581301所提到的,我建议您看看什么是右值,左值,x值,gl值和prvalues?
前面的描述是关于问题本身的,但最好像 getter 一样为数据编写一个 setter,如下所示
void setData(int newData){
data = newData;
}
这是问题行:
t2->GetData()=t2->GetNext()->GetData();
问题是 GetData(( 函数返回没有本地存储的成员数据的副本(您尚未将其分配给命名变量,因此它是一个右值(。编译器抱怨的原因是因为这实际上什么也没做。您正在为临时值分配一个新值,该值在行执行后立即消失。
将成员函数转换为
int& GetData(){
return data;
}
这意味着当你打电话t2->GetData()
它实际上指的是t2
的data
成员,而不仅仅是一个暂时消失的人。
真的,虽然最好data
成为公共成员变量,这样您就可以直接设置/读取它
这一行有问题:
t2->GetData()=t2->GetNext()->GetData();
您正在尝试将值分配给data
int。但是,GetData
成员函数不返回data
本身:而是返回一个临时副本。不能分配到临时。为了粗略简化,编译器将临时调用为rvalue
,将非临时称为lvalue
。赋值需要左值,因为分配给临时赋值毫无意义。
最好是使用 setter 函数来设置值:
t2->SetData(t2->GetNext()->GetData());
在这里,资源库将分配给data
数据成员。