枚举类型是无范围的,更喜欢枚举类而不是枚举?

时间:2021-02-24 23:23:37

标签: c++ enums compiler-errors visual-studio-2019

我是 C++ 的新手,我想知道是否有人可以帮助我理解为什么

enum difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE };
difficulty myDiffiuclty = EASY

enum shipCost { FIGHTER_COST = 25, BOMBER_COST, CRUISER_COST = 50 };
shipCost myShipCost = BOMBER_COST;

用绿色下划线?它说它更喜欢枚举类,但是当我将其更改为枚举类时

enum class difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE };
difficulty myDiffiuclty = EASY;

enum class shipCost { FIGHTER_COST = 25, BOMBER_COST, CRUISER_COST = 50 };
shipCost myShipCost = BOMBER_COST;

EASY 变成红色下划线并且 myShipCost 用绿色下划线,BOMBER_COST 用红色下划线,CRUISER_COST 用红色下划线

const int ALIEN_POINTS = 150;
int aliensKilled = 10;
int score = aliensKilled * ALIEN_POINTS;
cout << "score: " << score << endl;

enum difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE };
difficulty myDifficulty = EASY;

enum shipCost { FIGHTER_COST = 25, BOMBER_COST, CRUISER_COST = 50 };
shipCost myShipCost = BOMBER_COST;
cout << "\nTo upgrade my ship to a cruiser will cost "
    << (CRUISER_COST - myShipCost) << " Resource Points.\n";

system("pause");
return 0;

1 个答案:

答案 0 :(得分:4)

enum class difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE };
difficulty myDiffiuclty = difficulty::EASY;

enum class shipCost { FIGHTER_COST = 25, BOMBER_COST, CRUISER_COST = 50 };
shipCost myShipCost = shipCost::BOMBER_COST;

使用 enum class,删除了到/从整数的隐式转换,并且您必须限定其中的常量范围。

这被认为是一种改进。将其显式转换回整数仍然有效,但并非偶然发生。

std::cout << "\nTo upgrade my ship to a cruiser will cost "
    << (static_cast<int>(shipCost::CRUISER_COST) - static_cast<int>(myShipCost)) <<
    " Resource Points.\n";

system("pause");
return 0;

使用 enum class 后,您应该重命名它们:

enum class difficulty { novice, easy, normal, hard, unbeatable };
difficulty myDiffiuclty = difficulty::easy;

enum class shipCost { fighter =25, bomber=30, cruiser = 50 };
shipCost myShipCost = shipCost::bomber;

由于名称的 ship 部分现在在 enum 中,因此无需在常量中重复。同样,因为名称是有范围的,所以您不必SHOUT 它们。

但是请注意,如果您只是使用它来创建常量而不打算创建类型,请考虑使用以下内容:

namespace ship {
  namespace cost {
    constexpr int fighter = 25;
    constexpr int bomber = 30;
    constexpr int cruiser = 50;
  }
}

现在我们将 ship::cost::fighter 作为编译时计算的 int,而不是作为 enum class