【问题标题】:How to display the enum value for something within a class?如何显示类中某物的枚举值?
【发布时间】:2016-12-06 06:01:31
【问题描述】:

我目前正在构建游戏“Battleship”的不良版本,并且必须使用枚举数组来显示棋盘。对于我创建的标题:

enum class PlayerPiece {
  AIRCRAFT,
  BATTLESHIP,
  CRUISER,
  SUBMARINE,
  PATROL,
  EMPTY,
 };

 class Board {
 public:

   PlayerPiece playerBoard[100];
   PlayerPiece enemyBoard[100];

   void reset();
   void display() const;

 };

当我找到我的源代码时,我尝试将板显示为数字。截至目前,在我运行重置命令后,电路板为空。但是在我想显示数组之后,我收到一条错误消息“没有运算符

 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; // 

   };
 }

我已经编写了其他代码,我不必重载

【问题讨论】:

    标签: c++ class enums


    【解决方案1】:

    如果您想查看与作用域枚举类型关联的数字,请使用 static_cast,如下所示:

    cout << static_cast<int>(playerBoard[i]) << endl;
    

    普通(无作用域)枚举不需要此强制转换,因为它们的类型隐式强制转换为 int 或您指定的任何底层类型。这可能就是您以前没有发生过这种情况的原因。

    【讨论】:

      【解决方案2】:

      如果你删除类并使用无范围枚举编写枚举

      enum PlayerPiece {
      
        AIRCRAFT,
      
        BATTLESHIP,
      
        CRUISER,
      
        SUBMARINE,
      
        PATROL,
      
        EMPTY,
      
       };
      

      你可以打印你想要的号码。

      scoped和unscoped的区别(来自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 );
      }
      

      编辑并运行

      它可以编译,但它并不漂亮。

      使用 C++11,编译器现在可以了解有关枚举的各种信息,并且不会让您轻松地将它们与不正确的值混合在一起。

      本质上,它将枚举提升为一等对象——它不仅仅是一个整数。

      另一个问题是每个枚举的名称都渗入了包含范围。因此,以下将是名称冲突:

      1 2 枚举颜色掩码 { 红色 = 0xFF0000,绿色 = 0x00FF00,蓝色 = 0x0000FF }; 诠释红色 = 0xFF0000;

      您不能在同一范围内将标识符“red”作为枚举值和整数变量名。

      虽然这里的示例是人为设计的,但它与一直发生的事情并没有太远 - 程序员必须努力避免。

      (一些标识符名称很常见。例如,'max'。如果你 #include ,那里有一个 'max' 宏,如果你也 #include 并尝试使用 'max' 函数,它会造成严重破坏,或者#include 并尝试找到 numeric_limit ::max()。我知道这是一个宏问题,但这是我能想到的第一个名称冲突...)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多