我目前正在构建游戏“Battleship”的糟糕版本,并且必须使用一系列Enums来显示棋盘。对于我创建的标题:
void Board::reset(){
for (int i = 0; i < 100; ++i){
playerBoard[i] = PlayerPiece::EMPTY;
enemyBoard[i] = PlayerPiece::EMPTY;
};
}
void Board::display() const{
for (int i = 0; i < 100; ++i){
cout << playerBoard[i] << endl; //
};
}
当我找到我的源代码时,我尝试将该板显示为数字。截至目前,我运行我的重置命令后,该板是EMPTY。但是在我想显示数组之后,我得到一个错误,说“没有运算符&lt;&lt;匹配这些操作数......”,我明白这意味着我需要重载&lt;&lt;命令显示正确,但为什么不显示已分配的'5'?这不是恩赐的观点吗?到目前为止我所拥有的是:
{{1}}
我已经制作了其他代码,我不必重载&lt;&lt;操作员显示ENUM附带的编号。我错过了什么吗?任何帮助,将不胜感激。
答案 0 :(得分:2)
如果您想查看与作用域枚举类型相关联的数字,请使用static_cast
,如下所示:
cout << static_cast<int>(playerBoard[i]) << endl;
普通(无范围)枚举不需要此强制转换,因为它们的类型隐式转换为int,或者您指定的任何基础类型。这可能就是为什么以前没有发生过这种情况的原因。
答案 1 :(得分:0)
如果删除该类并使用Unscoped枚举编写枚举
enum PlayerPiece {
AIRCRAFT,
BATTLESHIP,
CRUISER,
SUBMARINE,
PATROL,
EMPTY,
};
您可以打印所需的号码。
作用域和未作用域的区别(来自cplusplus.com):
在C ++ 11之前,所有的枚举都只是整数。你可以这样使用它们。这使得为期望有限的一组值的函数提供坏值变得太容易了。例如:
1
2
3
4
5
6
7
8
9
10
enum round_mode { round_half_up, round_half_down, round_bankers };
double round( double x, round_mode = round_half_up )
{
...
};
int main()
{
double x = round( 2.5, 42 );
}
编辑&amp;运行
它编译,但它并不漂亮。
使用C ++ 11,编译器现在知道关于你的枚举的各种事情,并且不会让你轻易地将它们与不正确的值混合在一起。
基本上,它将枚举提升为第一类对象 - 它不仅仅是一个整数。
另一个问题是每个枚举的名称会渗透到包含范围中。所以以下是名称冲突:
1 2 enum color_masks {red = 0xFF0000,green = 0x00FF00,blue = 0x0000FF}; int red = 0xFF0000;
你不能同时拥有标识符&#39; red&#39;作为枚举值和同一范围内的整数变量名。
虽然这里的例子是人为的,但它与那些一直发生的事情相距甚远 - 并且程序员必须努力避免。
(有些标识符名称是常见的。例如,&#39; max&#39;。如果你#include,那里有一个最大的宏,如果你也是那么会造成严重破坏#include并尝试使用&#39; max&#39;函数或#include并尝试查找numeric_limit :: max()。我知道这是一个宏问题,但它是第一个姓名冲突我可以想出......)