求助:C++中如何为字符串重载左移运算符?附错误代码
解决字符串数字用
<<运算符相加的编译问题 首先得说,你原来的代码有几个关键问题导致编译失败:
- 不能给内置类型加成员函数:
const char*是C的内置指针类型,压根没法直接给它添加成员函数(那种用this的写法完全不符合语法)。而且C规定,运算符重载的操作数里至少得有一个是用户自定义类型,所以直接给两个const char*重载operator<<是不允许的。 - 语法逻辑混乱:就算重载写法能过,你返回
int本身没问题(cout能直接输出int),但整体的重载结构完全不对。
下面给你几个可行的解决方案,按需选择:
方案一:自定义包装类封装字符串数字
我们可以写一个简单的类来包装字符串形式的数字,然后为这个类重载operator<<来实现相加:
#include <iostream> #include <cstdlib> class StringNumber { private: const char* num_str; public: // 构造函数,接收字符串数字 StringNumber(const char* str) : num_str(str) {} // 重载左移运算符,和另一个字符串数字相加 int operator<<(const char* rhs) const { return std::atoi(num_str) + std::atoi(rhs); } }; int main() { const char* term1 = "12"; const char* term2 = "23"; // 把term1包装成我们的自定义对象,再调用重载的<< std::cout << (StringNumber(term1) << term2) << std::endl; // 输出35 return 0; }
方案二:借助std::string重载运算符
因为std::string是标准库的自定义类型,我们可以给它和const char*重载operator<<:
#include <iostream> #include <string> #include <cstdlib> // 非成员函数形式的重载 int operator<<(const std::string& lhs, const char* rhs) { return std::stoi(lhs) + std::atoi(rhs); } int main() { const char* term1 = "12"; const char* term2 = "23"; // 把term1转成std::string,就能用我们重载的<<了 std::cout << (std::string(term1) << term2) << std::endl; // 输出35 return 0; }
额外建议:用普通函数更直观
其实<<运算符的常规语义是左移或者输出到流,用它来做加法很容易让其他看代码的人困惑。如果不是必须用运算符重载,不如直接写个普通函数,可读性更高:
#include <iostream> #include <cstdlib> int addStringNumbers(const char* a, const char* b) { return std::atoi(a) + std::atoi(b); } int main() { const char* term1 = "12"; const char* term2 = "23"; std::cout << addStringNumbers(term1, term2) << std::endl; // 输出35 return 0; }
内容的提问来源于stack exchange,提问作者Pascal pizza
相关产品推荐
相关产品推荐

