C++中如何输出枚举类型的文本而非对应数值?
解决枚举值转文本输出的问题
嘿,这个问题我之前也踩过坑!你现在的switch语句漏掉了关键的break,导致不管匹配到哪个case,程序都会一直往下执行,最后moveStr总是被赋值成最后一个case的内容。先给你把switch的写法改对:
void Play::printMove(Direction dir) { std::string moveStr; switch (dir) { case NORTH: moveStr = "NORTH"; break; // 必须加break跳出当前case,避免穿透到下一个case case SOUTH: moveStr = "SOUTH"; break; case EAST: moveStr = "EAST"; break; case WEST: moveStr = "WEST"; break; default: // 处理无效的枚举值,避免出现未定义行为 moveStr = "UNKNOWN DIRECTION"; break; } std::cout << this->getName() << " moved to " << moveStr << std::endl; }
更简洁的替代方案
因为你的枚举值是连续的0-3,用数组映射会更简洁高效,不需要写一堆switch代码:
void Play::printMove(Direction dir) { // 数组索引和枚举值一一对应,直接通过下标访问 const std::string dirNames[] = {"NORTH", "SOUTH", "EAST", "WEST"}; // 先检查枚举值是否在有效范围内,防止数组越界 if (dir >= NORTH && dir <= WEST) { std::cout << this->getName() << " moved to " << dirNames[dir] << std::endl; } else { std::cout << this->getName() << " made an invalid move!" << std::endl; } }
如果是C++11及以后的版本,还可以用std::unordered_map来映射枚举和文本,但对于这种连续的枚举值,数组的方式性能最好,代码也最直观。
内容的提问来源于stack exchange,提问作者oldboy123
相关产品推荐
相关产品推荐

