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

如何在C++中基于字符数组获取枚举的索引值?

问题描述

我是编程新手,正在边学边练。这是我的第一篇提问,若表述不清还请见谅。
我正在学习一个国际象棋引擎开发教程,但教程是用C语言编写的,我尝试将其转为C++代码。这段代码的功能是输入一个字符,获取对应的枚举索引值,但现在出现编译错误,尝试多种方法后仍无头绪,该如何解决?

例如执行std::cout << CHAR_TO_PIECE['k'];,期望输出为11。

相关代码如下:

  • 在"typedefs.h"中:
enum Piece {P, N, B, R, Q, K, p, n, b, r, q, k};
  • 在"board.h"中:
extern const int CHAR_TO_PIECE[];
  • 在board.c中:
// convert ASCII character pieces to encoded constants
int CHAR_TO_PIECE[] = {
    ['P'] = P,
    ['N'] = N,
    ['B'] = B,
    ['R'] = R,
    ['Q'] = Q,
    ['K'] = K,
    ['p'] = p,
    ['n'] = n,
    ['b'] = b,
    ['r'] = r,
    ['q'] = q,
    ['k'] = k
};
问题原因

你用的是C语言独有的指定数组初始化器(比如['P'] = P这种写法),但C++标准并不支持该语法,这就是编译报错的核心原因。

解决方案

给你两种适合新手的简单修改方案:

方案一:基于ASCII值的数组初始化

字符本质对应ASCII数值(比如'P'是80,'k'是107),可以创建一个覆盖ASCII范围的数组,逐个给对应字符位置赋值:

  1. 将board.c重命名为board.cpp
  2. 修改数组初始化代码:
// 初始化一个大小为128的数组(覆盖所有ASCII字符),默认值设为-1或0均可
const int CHAR_TO_PIECE[128] = {0};
// 手动给对应字符位置赋值
CHAR_TO_PIECE['P'] = P;
CHAR_TO_PIECE['N'] = N;
CHAR_TO_PIECE['B'] = B;
CHAR_TO_PIECE['R'] = R;
CHAR_TO_PIECE['Q'] = Q;
CHAR_TO_PIECE['K'] = K;
CHAR_TO_PIECE['p'] = p;
CHAR_TO_PIECE['n'] = n;
CHAR_TO_PIECE['b'] = b;
CHAR_TO_PIECE['r'] = r;
CHAR_TO_PIECE['q'] = q;
CHAR_TO_PIECE['k'] = k;

board.h中的声明保持不变,之后执行std::cout << CHAR_TO_PIECE['k'];就能得到期望的11。

方案二:用C++哈希表替代数组

如果不想处理数组大小问题,用std::unordered_map做字符到枚举值的映射更直观:

  1. 修改board.h的声明:
#include <unordered_map>
extern const std::unordered_map<char, Piece> CHAR_TO_PIECE;
  1. 在board.cpp中实现映射:
#include "typedefs.h"
#include "board.h"

const std::unordered_map<char, Piece> CHAR_TO_PIECE = {
    {'P', P}, {'N', N}, {'B', B}, {'R', R}, {'Q', Q}, {'K', K},
    {'p', p}, {'n', n}, {'b', b}, {'r', r}, {'q', q}, {'k', k}
};

使用时改成std::cout << CHAR_TO_PIECE.at('k');(at()会检查字符是否存在,新手用更安全)。

补充说明

部分编译器(比如GCC)支持把C风格的指定初始化器作为扩展语法,但这不是标准C++,跨平台可能出问题,不建议依赖。

内容的提问来源于stack exchange,提问作者Edward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:25:35