You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:30:03