C++运算符重载代码运行无数据输出,请求排查问题原因
问题分析:mod5类输入输出无数据输出问题
首先看提供的mod5类及输入输出重载代码:
class mod5 { private: unsigned i; public: mod5() : i{} { } mod5(mod5 const&) = default; mod5& operator=(mod5 const&) = default; explicit mod5(unsigned value) : i{value} { } unsigned mod_value() const { return i % 5; } friend auto operator<=>(mod5 const& lhs, mod5 const& rhs) { return lhs.mod_value() <=> rhs.mod_value(); } }; std::istream& operator>>(std::istream& is, mod5& m) { unsigned int temp; if(is >> temp ){ m = mod5(temp); } else{ is.setstate(std::ios_base::failbit); } return is; } std::ostream& operator<<(std::ostream& os, mod5 const& m) { os << m.mod_value(); return os; }
问题排查
编译成功但运行无数据输出,运行结果为:rel_demo: operator==(): rel_demo: operator<(): rel_demo: operator>(): stack(0):,说明无有效数据被导入,进而无内容可输出。
operator<<函数无问题:它直接输出mod_value()的结果,只要mod5对象有合法值,就能正确输出对应的模5结果,逻辑完全正确。- 问题大概率出在输入环节(
operator>>相关):- 输入函数本身的逻辑没有致命错误,但存在冗余操作:当
is >> temp失败时,流本身已经处于fail状态,无需再次调用is.setstate(std::ios_base::failbit),不过这个冗余不会导致无数据输出。 - 真正的无数据输出原因,更可能是输入时未读取到有效数据:比如输入文件不存在、文件内容不是合法的无符号整数,或者测试代码中没有正确处理输入流状态(比如未检查流是否成功打开),导致没有成功读取任何
mod5对象,最终没有内容可输出。
- 输入函数本身的逻辑没有致命错误,但存在冗余操作:当
内容的提问来源于stack exchange,提问作者gimon
相关产品推荐
相关产品推荐

