MyString类重载--运算符异常:未返回最短单词求助
解决MyString类重载--运算符返回原字符串的问题
嘿,我来帮你搞定这个问题!你遇到的问题大概率是重载的--运算符没有正确返回包含最短单词的新对象,而是直接返回了原对象。咱们一步步来修复它:
先分析错误根源
你之前的重载代码可能类似这样(错误示例):
MyString operator--() { // 可能写了找最短单词的逻辑,但最后直接返回原对象 return *this; }
这种写法只会返回原来的MyString实例,自然输出的还是"one two three",而不是你要的"one"。
正确的实现步骤
要实现用--运算符查找最短单词,我们需要在重载函数里完成这几件事:
- 把原字符串按空格分割成单词列表
- 遍历列表找到长度最短的单词(如果有多个长度相同的,这里默认取第一个)
- 返回一个包含这个最短单词的新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
相关产品推荐
相关产品推荐

