237

次のenumようなものがあるとします。

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

このインスタンスを作成enumし、適切な値で初期化したいので、次のようにします。

Days day = Days.Saturday;

enum次に、変数またはインスタンスを既存の値でチェックしたいので、次のようにします。

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

これにより、コンパイルエラーが発生します。

エラー:「。」の前にプライマリ式が必要です。トークン

明確にするために、言うことの違いは何ですか:

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

if (day == Saturday)

1つはOKで、もう1つはコンパイルエラーを引き起こすという点で、これら2つは実際に何を指しているのでしょうか。

4

14 に答える 14

380

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

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)

幸いなことに、Mike Seymourは、これが C++11 で対処されていることを観察しています。に変更enumするenum classと、独自のスコープが取得されます。soDays::Sundayは有効であるだけでなく、にアクセスする唯一Sundayの方法です。幸せな日々!

于 2012-08-29T17:26:52.940 に答える
26

enum 変数を宣言して比較するには、これで十分です。

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday) {
    std::cout << "Ok its Saturday";
}
于 2012-08-29T17:04:03.990 に答える
24

これの多くは、コンパイルエラーを引き起こすはずです。

// note the lower case enum keyword
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };

これで、、SaturdayなどSundayを最上位の裸の定数Daysとして使用でき、タイプとして使用できます。

Days day = Saturday;   // Days.Saturday is an error

そして同様に後で、テストするために:

if (day == Saturday)
    // ...

これらのenum値は、裸の定数のようなものであり、スコープはありませんが、コンパイラの助けを少し借ります(C ++ 11列挙型クラスを使用している場合を除く)。たとえば、オブジェクトや構造体のメンバーのようにカプセル化されていません。それらをのメンバーとして参照することはできませんDays

あなたはC++11であなたが探しているものを手に入れるでしょう、それは:を導入しenum classます

enum class Days
{
    SUNDAY,
    MONDAY,
    // ... etc.
}

// ...

if (day == Days::SUNDAY)
    // ...

このC++は、いくつかの点でCとは少し異なることに注意してください。1つは、Cがenum変数を宣言するときにキーワードを使用する必要があることです。

// day declaration in C:
enum Days day = Saturday;
于 2012-08-29T17:07:11.807 に答える
18

トリックを使用して、必要に応じてスコープを使用できます。そのような方法で列挙型を宣言するだけです。

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

Days::type day = Days::Saturday;
if (day == Days::Saturday)
于 2014-09-11T11:39:06.043 に答える
12

列挙型は、一連のifステートメントを使用するのではなく、ステートメントを切り替えるのに適しています。

ゲーム用に構築しているレベルビルダーで、列挙型とスイッチの組み合わせをいくつか使用しています。

編集:別のことですが、次のような構文が必要だと思います。

if(day == Days.Saturday)
etc

これはC++で実行できます。

if(day == Days::Saturday)
etc

非常に簡単な例を次に示します。

EnumAppState.h

#ifndef ENUMAPPSTATE_H
#define ENUMAPPSTATE_H
enum eAppState
{
    STARTUP,
    EDIT,
    ZONECREATION,
    SHUTDOWN,
    NOCHANGE
};
#endif

Somefile.cpp

#include "EnumAppState.h"
eAppState state = eAppState::STARTUP;
switch(state)
{
case STARTUP:
    //Do stuff
    break;
case EDIT:
    //Do stuff
    break;
case ZONECREATION:
    //Do stuff
    break;
case SHUTDOWN:
    //Do stuff
    break;
case NOCHANGE:
    //Do stuff
    break;
}
于 2012-08-29T17:10:53.790 に答える
7

これは C++ では機能しません。

Days.Saturday

Days は、ドット演算子でアクセスできるメンバーを含むスコープまたはオブジェクトではありません。この構文は単なる C# 主義であり、C++ では有効ではありません。

Microsoft は、スコープ演算子を使用して識別子にアクセスできるようにする C++ 拡張機能を長い間維持してきました。

enum E { A, B, C };

A;
E::B; // works with Microsoft's extension

しかし、これは C++11 より前では非標準です。C++03 では、列挙型で宣言された識別子は、列挙型自体と同じスコープにのみ存在します。

A;
E::B; // error in C++03

C++11 では、enum 名で enum 識別子を修飾することが合法になり、enum クラスも導入されました。これは、識別子を周囲のスコープに配置するのではなく、識別子の新しいスコープを作成します。

A;
E::B; // legal in C++11

enum class F { A, B, C };

A; // error
F::B;
于 2012-08-29T17:18:14.773 に答える
5

悲しいことに、列挙型の要素は「グローバル」です。を実行してアクセスしますday = Saturday。つまり、それらは競合しているため、enum A { a, b } ;持つことができません。enum B { b, a } ;

于 2012-08-29T17:10:04.103 に答える
4

C++ (C++11 を除く) には列挙型がありますが、それらの値はグローバル名前空間に「リーク」されます。
それらをリークさせたくない場合(および列挙型を使用する必要がない場合)は、次のことを考慮してください。

class EnumName {  
   public:   
      static int EnumVal1;  
      (more definitions)  
};  
EnumName::EnumVal1 = {value};  
if ([your value] == EnumName::EnumVal1)  ...
于 2016-04-11T01:43:56.247 に答える
3

C++ の列挙型は、列挙値を宣言するときに、指定した名前でマスクされた整数のようなものです (これは定義ではなく、動作のヒントにすぎません)。

ただし、コードには 2 つのエラーがあります。

  1. enumすべて小文字で綴る
  2. Days.前の土曜日は必要ありません。
  3. この列挙型がクラスで宣言されている場合は、使用します if (day == YourClass::Saturday){}
于 2012-08-29T17:09:05.083 に答える
1

あなたの根本的な問題は、名前空間を使用する の.代わりに を使用することだと思います。::

試す:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days::Saturday;
if(Days::Saturday == day)  // I like literals before variables :)
{
    std::cout<<"Ok its Saturday";
}
于 2015-06-06T19:30:37.823 に答える
-15

まず、列挙型の「E」、小文字の「e」を作成します。

次に、タイプ名「Days」を「Days.Saturday」にドロップします。

第三に...自分で良いC++の本を買う。

于 2012-08-29T17:11:22.850 に答える