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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:51:34