C++ 含枚举成员的类重载>>和<<输入输出流运算符实现问题
问题核心原因
C++ 强类型枚举(enum class)默认没有内置输入输出流的运算符重载,标准库不会为自定义枚举自动提供iostream操作支持,因此直接读写枚举成员必然触发编译错误。
无需辅助函数的实现方案(读写枚举数值)
如果你需要像操作普通整数一样直接读写枚举的底层数值,不需要转换为字符串,可以直接通过枚举底层类型转换实现,完全不需要额外的辅助函数:
步骤1:新增头文件依赖
在Piece.h中添加<type_traits>头文件,用于获取枚举的底层类型:
#include <type_traits>
步骤2:修正流运算符实现
修改Source.cpp中的运算符代码:
#include <iostream> #include "Piece.h" std::istream& operator>>(std::istream& is, Piece& toBeReadInto) { // 先读枚举对应的底层整数值 std::underlying_type_t<Piece::Color> colorVal; is >> toBeReadInto.m_value >> colorVal; // 强制转为Color枚举类型赋值 toBeReadInto.m_color = static_cast<Piece::Color>(colorVal); return is; } std::ostream& operator<<(std::ostream& os, const Piece& toBeShown) { // 把枚举强制转为底层整数类型输出 os << toBeShown.m_value << " " << static_cast<std::underlying_type_t<Piece::Color>>(toBeShown.m_color); return os; }
关于字符串形式的读写说明
如果你需要输入输出枚举对应的字符串(比如输出red而不是数字0),那不存在完全不需要转换逻辑的实现方案,因为C++没有内置枚举到字符串的反射能力,你必须自己定义枚举值和字符串的映射关系,无非是可以把转换逻辑直接写在流运算符里,不单独抽成getStringFromEnum这类辅助函数而已,本质还是需要自己实现转换逻辑。
现有代码的其他问题修正
- 头文件中
getStringFromEnum声明为const成员函数,但cpp中的实现没有加const修饰,会编译报错,需要把cpp中的实现改为:
std::string Piece::getStringFromEnum(Color color) const
- 你实现的
operator=逻辑是比较两个对象是否相等,完全不符合赋值运算符的定义,赋值运算符应该返回Piece&类型,你当前的实现本质是operator==的逻辑,建议调整。 - 你原来的
operator<<里误用了toBeReadInto变量,属于笔误,应该用形参toBeShown。
内容的提问来源于stack exchange,提问作者user14399919
相关产品推荐
相关产品推荐

