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
相关产品推荐
相关产品推荐

