C++ stri类链式调用set函数无法通过测试求助
解决stri类set函数的链式调用问题
你遇到的核心问题是没掌握链式调用的关键逻辑——要实现obj.func1().func2()这种连续调用,成员函数需要返回当前对象的引用,这样后续的函数调用才能持续作用在同一个对象上。
问题分析
你当前的set函数大概率是void返回类型,比如:
void stri::set(const char* str) { // 你的赋值逻辑 }
这种写法下,调用greet.set("Hi")后没有返回值,自然无法接着链式调用.set("Buna")。
修正方案
修改set函数的返回类型为stri&(当前对象的引用),并在函数末尾返回*this:
// 头文件中的stri类声明 class stri { private: char* m_data = nullptr; // 假设内部用动态数组存储字符串 public: // 构造函数 stri(const char* str = "") { size_t len = strlen(str); m_data = new char[len + 1]; strcpy(m_data, str); } // 析构函数 ~stri() { delete[] m_data; } // 修改set的返回类型为stri& stri& set(const char* str); // 获取内部字符串的方法 const char* get() const { return m_data; } // 补充:为避免浅拷贝问题,需实现拷贝构造和赋值重载(可选但推荐) stri(const stri& other); stri& operator=(const stri& other); }; // 源文件中的set函数实现 stri& stri::set(const char* str) { // 先释放原有内存,避免内存泄漏 if (m_data != nullptr) { delete[] m_data; } // 分配新内存并复制传入的字符串 size_t len = strlen(str); m_data = new char[len + 1]; strcpy(m_data, str); // 关键:返回当前对象的引用 return *this; }
为什么这样能行?
*this代表当前调用set函数的对象(比如测试里的greet),返回它的引用后,greet.set("Hi")的结果就是greet本身的引用。- 接着调用
.set("Buna")时,依然是对greet对象进行操作,最终greet的内部值会被更新为"Buna",完美通过测试。
⚠️ 注意:不要返回对象的值(比如stri而非stri&),那样会返回一个临时对象的拷贝,后续的set操作只会修改临时对象,原对象greet不会被改变,依然无法通过测试。
内容的提问来源于stack exchange,提问作者SixSickSheep
相关产品推荐
相关产品推荐

