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

MyString类重载--运算符异常:未返回最短单词求助

解决MyString类重载--运算符返回原字符串的问题

嘿,我来帮你搞定这个问题!你遇到的问题大概率是重载的--运算符没有正确返回包含最短单词的新对象,而是直接返回了原对象。咱们一步步来修复它:

先分析错误根源

你之前的重载代码可能类似这样(错误示例):

MyString operator--() {
    // 可能写了找最短单词的逻辑,但最后直接返回原对象
    return *this;
}

这种写法只会返回原来的MyString实例,自然输出的还是"one two three",而不是你要的"one"。

正确的实现步骤

要实现用--运算符查找最短单词,我们需要在重载函数里完成这几件事:

  1. 把原字符串按空格分割成单词列表
  2. 遍历列表找到长度最短的单词(如果有多个长度相同的,这里默认取第一个)
  3. 返回一个包含这个最短单词的新MyString对象(或者修改原对象后返回,看你的需求)

完整代码示例

假设你的MyString类有一个std::string类型的成员存储字符串,下面是完整的实现:

#include <string>
#include <vector>
#include <sstream>
#include <algorithm>

class MyString {
private:
    std::string str;
public:
    // 构造函数
    MyString(const std::string& s) : str(s) {}

    // 获取内部字符串的方法
    std::string getStr() const { return str; }

    // 前置--运算符重载:返回最短单词,不修改原对象
    MyString operator--() {
        // 分割字符串为单词列表
        std::vector<std::string> words;
        std::stringstream ss(str);
        std::string word;
        while (ss >> word) {
            words.push_back(word);
        }

        // 处理空字符串情况
        if (words.empty()) {
            return MyString("");
        }

        // 查找最短单词
        std::string shortest_word = words[0];
        for (const auto& w : words) {
            if (w.size() < shortest_word.size()) {
                shortest_word = w;
            }
        }

        // 返回包含最短单词的新MyString对象
        return MyString(shortest_word);
    }

    // 如果需要后置--运算符(带int参数区分),可以这样实现
    MyString operator--(int) {
        // 这里逻辑和前置一致,按需求调整是否修改原对象
        std::vector<std::string> words;
        std::stringstream ss(str);
        std::string word;
        while (ss >> word) {
            words.push_back(word);
        }

        if (words.empty()) {
            return MyString("");
        }

        std::string shortest_word = words[0];
        for (const auto& w : words) {
            if (w.size() < shortest_word.size()) {
                shortest_word = w;
            }
        }

        return MyString(shortest_word);
    }
};

测试代码

用这段代码验证功能:

#include <iostream>

int main() {
    MyString my_str("one two three");
    MyString shortest = --my_str;
    std::cout << shortest.getStr() << std::endl; // 输出: one
    return 0;
}

可选:修改原对象的版本

如果你希望执行--my_str后,原对象的内容也变成最短单词,可以把前置重载改成引用返回,并修改内部的str成员:

MyString& operator--() {
    std::vector<std::string> words;
    std::stringstream ss(str);
    std::string word;
    while (ss >> word) {
        words.push_back(word);
    }

    if (!words.empty()) {
        std::string shortest_word = words[0];
        for (const auto& w : words) {
            if (w.size() < shortest_word.size()) {
                shortest_word = w;
            }
        }
        str = shortest_word; // 修改原对象的字符串
    }

    return *this;
}

这样执行--my_str后,my_str.getStr()也会返回"one"。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:23:19