C++:无需cin/cout,重载Stack类的<<与>>运算符实现元素操作
给你几个关键提示,帮你搞定这个运算符重载问题
首先得指出你当前实现里的两个核心问题:
- 传值导致修改无效:你把
Stack按值传递给operator<<了,这意味着你操作的是原栈的一个临时拷贝,push的元素都存在副本里,原栈根本没变化,链式调用也只是在临时对象上折腾,最后原栈还是空的。 - 返回类型完全错了:你返回的是
std::ostream&,但你的需求是用<<实现链式入栈(比如stack <<1<<2),这需要返回Stack的引用,而不是输出流——毕竟你不是在做控制台输出,是自定义的入栈操作呀。
正确的<<运算符(入栈)实现思路
你需要把运算符定义成全局函数(或者类的友元,如果push是私有成员的话),参数用Stack的引用,返回也是Stack的引用,这样才能链式修改原栈:
Stack& operator<<(Stack& stack, const double& value) { stack.push(value); return stack; }
这样每次调用都会直接修改原栈,并且返回原栈的引用,就能支持stack <<1<<2<<3这种链式操作了。
正确的>>运算符(出栈)实现思路
同理,出栈的>>也要返回Stack的引用,参数是栈的引用和接收值的变量引用,还要注意处理栈为空的异常情况:
#include <stdexcept> // 用于抛出异常 Stack& operator>>(Stack& stack, double& value) { if (stack.isEmpty()) { // 假设你的Stack类有isEmpty方法判断是否为空 throw std::underflow_error("栈为空,无法弹出元素"); } value = stack.pop(); // 假设pop方法会返回栈顶元素并移除它 return stack; }
这样stack >>a>>b>>c就能依次把栈顶元素(3、2、1)赋值给a、b、c,完全符合你的需求。
额外注意点
如果你的Stack类的push、pop是私有成员,记得在类里把这两个运算符声明为友元:
class Stack { private: // 你的私有成员变量和push、pop等私有方法 public: // 其他公共方法,比如isEmpty() friend Stack& operator<<(Stack& stack, const double& value); friend Stack& operator>>(Stack& stack, double& value); };
内容的提问来源于stack exchange,提问作者Coolerini
相关产品推荐
相关产品推荐

