C++;从字符枚举 我是C++新手。我拿到了比亚恩的书,我试着跟着计算器的代码
但是,编译器抛出了一个有关此部分的错误:C++;从字符枚举 我是C++新手。我拿到了比亚恩的书,我试着跟着计算器的代码,c++,enums,char,C++,Enums,Char,但是,编译器抛出了一个有关此部分的错误: token_value get_token() { char ch; do { // skip whitespace except '\n' if(!std::cin.get(ch)) return curr_tok = END; } while (ch!='\n' && isspace(ch)); switch (ch) { case ';':
token_value get_token()
{
char ch;
do { // skip whitespace except '\n'
if(!std::cin.get(ch)) return curr_tok = END;
} while (ch!='\n' && isspace(ch));
switch (ch) {
case ';':
case '\n':
std::cin >> WS; // skip whitespace
return curr_tok=PRINT;
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return curr_tok=ch;
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9': case '.':
std::cin.putback(ch);
std::cin >> number_value;
return curr_tok=NUMBER;
default: // NAME, NAME=, or error
if (isalpha(ch)) {
char* p = name_string;
*p++ = ch;
while (std::cin.get(ch) && isalnum(ch)) *p++ = ch;
std::cin.putback(ch);
*p = 0;
return curr_tok=NAME;
}
error("bad token");
return curr_tok=PRINT;
}
它吐出的错误是:
calc.cpp:42: error: invalid conversion from ‘char’ to ‘token_value’
token\u value
是一个如下所示的枚举:
enum token_value {
NAME, NUMBER, END,
PLUS='+', MINUS='-', MUL='*', DIV='/',
PRINT=';', ASSIGN='=', LP='(', RP=')'
};
token_value curr_tok;
我的问题是,如何将ch(从cin)转换为关联的枚举值?您不能将
char
隐式转换为enum
——您必须显式执行此操作:
return curr_tok = static_cast<token_value> (ch);
return curr\u tok=static\u cast(ch);
但是要小心!如果没有一个
enum
值与char
匹配,则很难使用结果:)您需要显式强制转换:
curr_tok = static_cast<token_value>(ch);
curr_tok=静态(ch);
原因是将整数类型转换为枚举很危险。如果该值对枚举无效,则行为未定义。因此,该语言不允许您通过隐式转换意外地进行转换。显式转换应该意味着“我知道我在做什么,并且我已经检查了该值是否有效”。请注意,给出的解决方案(即告诉您使用
静态\u cast
)只能正常工作,因为当定义枚举符号时,符号(例如加上)被定义为具有恰好等于基础字符值的物理/数字值(例如,“+”
)
另一种方法(不使用强制转换)是使用switch/case语句显式指定为每个字符值返回的枚举值,例如:
case '*':
return curr_tok=MUL;
case '/':
return curr_tok=DIV;
我想我不会尝试显式地设置枚举符号的值,而是为switch语句中的每个符号编写一个case。如果出现问题,并且为每个符号编写一个案例的性能成本非常低,甚至不值得考虑(除非您是为某种极低端的嵌入式系统编写的,而且可能仍然不值得),那么这样做可能会更难调试。更喜欢使用新样式转换当使用C++代替C.或如果你想使用C样式的转换时,使用构造函数语法将它们隐藏在雷达下面:<代码> Currytokk=TokKoNoY值(CH)
。样式指南的作者在禁止单参数构造函数之前可能会三思而后行,即使它们只能使用C样式转换调用。;-)
case '*':
return curr_tok=MUL;
case '/':
return curr_tok=DIV;