枚举类型没有作用域,更喜欢枚举类而不是枚举?

cmc*_*123 4 c++ enums compiler-errors visual-studio-2019

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

enum difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE };
difficulty myDiffiuclty = EASY
Run Code Online (Sandbox Code Playgroud)

enum shipCost { FIGHTER_COST = 25, BOMBER_COST, CRUISER_COST = 50 };
shipCost myShipCost = BOMBER_COST;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

Yak*_*ont 9

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;
Run Code Online (Sandbox Code Playgroud)

使用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;
Run Code Online (Sandbox Code Playgroud)

一旦你使用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;
Run Code Online (Sandbox Code Playgroud)

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

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

namespace ship {
  namespace cost {
    constexpr int fighter = 25;
    constexpr int bomber = 30;
    constexpr int cruiser = 50;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我们有ship::cost::fighter一个编译时计算的 an int,而不是一个enum class