我想在 c++ 中对单向链表进行冒泡排序,但我一直面临左值错误,无法解决它



这是可以帮助您理解我的问题的代码,我正在使用节点类和列表类。这是错误:[错误] 左键需要作为赋值的左操作数。任何帮助将不胜感激..!!

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()它实际上指的是t2data成员,而不仅仅是一个暂时消失的人。

真的,虽然最好data成为公共成员变量,这样您就可以直接设置/读取它

这一行有问题:

t2->GetData()=t2->GetNext()->GetData();

您正在尝试将值分配给dataint。但是,GetData成员函数不返回data本身:而是返回一个临时副本。不能分配到临时。为了粗略简化,编译器将临时调用为rvalue,将非临时称为lvalue。赋值需要左值,因为分配给临时赋值毫无意义。

最好是使用 setter 函数来设置值:

t2->SetData(t2->GetNext()->GetData());

在这里,资源库将分配给data数据成员。

相关内容

  • 没有找到相关文章

最新更新