如何在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范围的数组,逐个给对应字符位置赋值:
- 将
board.c重命名为board.cpp - 修改数组初始化代码:
// 初始化一个大小为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做字符到枚举值的映射更直观:
- 修改
board.h的声明:
#include <unordered_map> extern const std::unordered_map<char, Piece> CHAR_TO_PIECE;
- 在
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
相关产品推荐
相关产品推荐

