1. ホーム
  2. c++

[解決済み】なぜenumクラスはプレーンなenumより好ましいのですか?

2022-04-13 05:07:09

質問

enumを使うことを推奨している人が何人かいたと聞いています。 クラス のため、C++で タイプセーフティ .

しかし、その真意は?

どのように解決するのですか?

C++には、以下の2種類があります。 enum :

  1. enum class
  2. プレーン enum s

ここでは、その宣言の仕方について、いくつかの例を挙げて説明します。

 enum class Color { red, green, blue }; // enum class
 enum Animal { dog, cat, bird, human }; // plain enum 

この2つの違いは何ですか?

  • enum class es - 列挙体名は ローカル を列挙し、その値は ない は暗黙のうちに他の型に変換されます(例えば別の enum または int )

  • プレーン enum ここで、列挙子名は列挙子と同じスコープにあり、その列挙子名は の値は暗黙のうちに整数や他の型に変換されます。

enum Color { red, green, blue };                    // plain enum 
enum Card { red_card, green_card, yellow_card };    // another plain enum 
enum class Animal { dog, deer, cat, bird, human };  // enum class
enum class Mammal { kangaroo, deer, human };        // another enum class

void fun() {

    // examples of bad use of plain enums:
    Color color = Color::red;
    Card card = Card::green_card;

    int num = color;    // no problem

    if (color == Card::red_card) // no problem (bad)
        cout << "bad" << endl;

    if (card == Color::green)   // no problem (bad)
        cout << "bad" << endl;

    // examples of good use of enum classes (safe)
    Animal a = Animal::deer;
    Mammal m = Mammal::deer;

    int num2 = a;   // error
    if (m == a)         // error (good)
        cout << "bad" << endl;

    if (a == Mammal::deer) // error (good)
        cout << "bad" << endl;

}

結論

enum class なぜなら、バグにつながる可能性のあるサプライズが少ないからです。