You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:06:03