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

C++链表中Setter/Getter未按预期工作问题求助

链表中Setter/Getter方法不生效的问题排查

问题描述

由于某些原因,我的教授要求我在所有地方使用setter/getter方法。然而在这个链表实现中,我无法理解为何该方法不生效。预期输出为"a string",但实际输出为空,请问我哪里出错了?

代码实现

#include <iostream>
#include <string>
using namespace std;

class SomeClass{
    string some_string;
public:
    void setSomeString(string s);
    string getSomeString();
};

void SomeClass::setSomeString(string s){
    some_string = s;
}

string SomeClass::getSomeString(){
    return some_string;
}

class Node{
    SomeClass some_class;
    Node *next;
public:
    void setSomeClass(SomeClass sc);
    SomeClass getSomeClass();
    //...
};

void Node::setSomeClass(SomeClass sc){
    some_class = sc;
}

SomeClass Node::getSomeClass(){
    return some_class;
}

class List{
public:
    Node *head, *ptr;
    //...
};

int main(){

    List l;
    l.head = new Node();
    l.head->getSomeClass().setSomeString("a string");

    cout << l.head->getSomeClass().getSomeString();
    return 0;
}

问题原因

核心问题在于Node::getSomeClass()的返回值是值拷贝,而非引用。

当执行l.head->getSomeClass().setSomeString("a string")时,getSomeClass()会返回Node内部some_class的一个临时副本,你调用setSomeString修改的只是这个副本的内容,原Node对象里的some_class完全没有被改动。这条语句执行完毕后,临时副本就会被销毁,后续调用getSomeClass()拿到的还是初始状态的空字符串对象。

解决方法

将getSomeClass()的返回类型修改为引用,这样返回的就是Node内部some_class的直接引用,调用setSomeString时修改的就是原对象的内容:

// 修改Node类的声明
class Node{
    SomeClass some_class;
    Node *next;
public:
    void setSomeClass(SomeClass sc);
    SomeClass& getSomeClass(); // 修改为引用返回
    //...
};

// 修改定义部分
SomeClass& Node::getSomeClass(){
    return some_class;
}

如果需要支持只读场景(防止外部通过引用修改原对象),可以额外重载一个const版本的getter:

// Node类声明中添加
const SomeClass& getSomeClass() const;

// 实现const版本
const SomeClass& Node::getSomeClass() const {
    return some_class;
}

内容的提问来源于stack exchange,提问作者starDuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:55:47