C++链表交换节点时GetID()赋值报错“表达式不可赋值”的原因及解决
链表节点值交换赋值报错原因及解决方案
报错原因
s->GetID()=temp触发表达式不可赋值错误,核心原因有两点:
Contact::GetID()返回的是int类型的临时右值,C++语法规定只有左值(具备持久内存空间、可被取地址的表达式)才能放在赋值运算符左侧,临时返回值属于运算过程中生成的临时量,执行完当前语句就会销毁,没有可写的内存地址,不支持赋值操作。- 当前
GetID()的设计定位是只读取值接口,仅用于返回私有成员id的值,本身没有提供修改id的能力。
另外你当前的代码还存在逻辑漏洞:if(t->GetID()>s->GetID())后没有加花括号,只有checkfield=1一行受判断条件控制,后续的赋值逻辑无论判断是否成立都会执行,需要修正。
解决方案
方案1:新增SetID接口(推荐,符合类封装规范)
给Contact类新增专门的ID写入接口:
void Contact::SetID(int newId) { id = newId; }
替换原有赋值逻辑,同时补充if判断的花括号即可:
if(t->GetID() > s->GetID()) { checkfield = 1; temp = t->GetID(); temp2 = s->GetID(); s->SetID(temp); t->SetID(temp2); }
方案2:修改GetID返回值为引用(仅适合临时调试)
如果不想新增成员函数,可以修改GetID的定义,返回私有成员id的左值引用:
int& Contact::GetID(){ return id; }
修改后GetID()返回的是id成员的引用,属于可修改的左值,原有s->GetID()=temp语法可正常运行。但该方式会直接暴露私有成员的修改权限,违反类封装设计原则,不推荐在正式代码中使用。
内容的提问来源于stack exchange,提问作者Skydaz
相关产品推荐
相关产品推荐

