我想在C++中对一个单列链接的列表进行气泡排序,但我一直面临一个lvalue错误,无法解决。

问题描述 投票:0回答:1

以下代码可能会帮助你理解我的问题,我使用的是一个节点类和一个列表类。下面是错误。[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;
                    }
                }
            }
        }
};
c++ sorting data-structures linked-list bubble-sort
1个回答
1
投票

你正试图将数据分配给一个 rvalue.这 rvalue 是你的数据的临时副本,不是原始数据。一旦表达式执行,它就会被销毁,因此 u 不能对它进行赋值。

要分配给你的数据,u必须返回一个对它的引用,如下图所示

int& GetData(){
    return data;
}

正如用户4581301所提到的,我建议你看看这个。什么是rvalues、lvalues、xvalues、glvalues和prvalues?

前面的描述是关于问题本身的,但最好是像你的getter那样为你的数据写一个setter,如下所示

void setData(int newData){
    data = newData;
}

0
投票

这里是问题线。

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

问题是GetData()函数返回的是成员数据的副本,而这个数据没有本地存储(你没有把它分配给一个命名变量,因此它是一个r值)。编译器抱怨的原因是,这实际上什么也没做。你给一个临时值赋了一个新的值,而这个值在这行执行后马上就会消失。

将成员函数转换为

int& GetData(){
    return data;
}

意思是当你呼叫 t2->GetData() 指的是 data 成员 t2 并不是临时就能消失的。

不过说真的,可能只是让你更好地 data 公共成员变量,所以你可以直接从它那里设置itread


0
投票

这一行是有问题的。

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

你是想把一个值赋给... data int。然而 GetData 成员函数不返回 data 本身:is 会返回一个临时副本。你不能赋值到临时文件中。为了过于简化,编译器将临时文件调用为 rvalue和非临时性的,如 lvalue. 赋值需要l值,因为如果赋值到时态里,意义不大。

最好的办法是使用setter函数来设置值。

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

在这里,setter将赋值到 data 数据成员。

© www.soinside.com 2019 - 2024. All rights reserved.