1. ホーム
  2. c++

[解決済み】C++でenumを使用する方法

2022-04-04 21:46:02

質問

があるとします。 enum のようにします。

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};

このインスタンスを作成したい enum を作成し、適切な値で初期化する必要があるので、そうします。

Days day = Days.Saturday;

ここで、変数やインスタンスを、既存の enum の値なので、そうします。

if (day == Days.Saturday)
{
    std::cout << "Ok its Saturday";
}

これはコンパイルエラーになります。

error: '.' トークンの前に一次式があることが予想されます。

というのは、はっきり言って、何が違うのでしょう。

if (day == Days.Saturday) // Causes compilation error

そして

if (day == Saturday)

?

この2つのうち、1つはOKで、1つはコンパイルエラーになるということは、実際には何を指しているのでしょうか?

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

このコードは間違っています。

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)

なぜなら Days はスコープでもオブジェクトでもない。それは型です。そして、型そのものはメンバを持ちません。あなたが書いたものは、次のものと同等です。 std::string.clear . std::string は型なので . を使用します。 この場合 . の上に インスタンス クラスの

残念ながら、列挙は魔法のようなものなので、類推はそこで止まってしまいます。 なぜなら、クラスでは std::string::clear でメンバ関数へのポインタを取得しますが、C++03では Days::Sunday は無効です。 (これは悲しいことですが)。 これは、C++がCと(多少)後方互換性があり、Cには名前空間がなかったので、列挙はグローバルな名前空間になければならなかったからです。 だから、構文は単純に

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday)

幸いです。 マイク・シーモア C++11で対処されたとのことです。 enum から enum class で、それ自身のスコープを取得します。 Days::Sunday は有効であるだけでなく だけ にアクセスする方法です。 Sunday . ハッピーデイズ!