[c++] C ++에서 열거 형을 사용하는 방법

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)

?

이 두 가지는 실제로 무엇을 의미합니까? 하나는 정상이고 하나는 컴파일 오류를 유발합니까?



답변

이 코드는 잘못되었습니다 :

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에서 해결되었음을 관찰합니다. 변경 enumenum class그것의 자신의 범위를 얻고; 따라서 Days::Sunday유효 할 뿐만 아니라 에 액세스 할 수 있는 유일한 방법 Sunday입니다. 행복한 날들!


답변

이것은 열거 형 변수를 선언하고 비교하기에 충분합니다.

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday) {
    std::cout << "Ok its Saturday";
}


답변

이 중 많은 부분에 컴파일 오류가 발생합니다.

// 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) 사용하지 않는 : 컴파일러에서 약간의 여분의 도움으로 – -scoped 열거 클래스 가) 없습니다 예를 들어 개체 또는 구조 멤버와 같이 캡슐화하고, 님을 회원 으로 참조 할 수 없습니다 Days.

당신은 당신이 찾고있는 무엇을해야 C ++ 11 소개 enum class:

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

// ...

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

이 C ++는 몇 가지면에서 C와 약간 다릅니다. 하나는 C를 사용해야한다는 것입니다. enum 변수를 선언 할 때 키워드를 .

// day declaration in C:
enum Days day = Saturday;


답변

원하는대로 범위를 사용하는 트릭을 사용할 수 있습니다. enum을 다음과 같이 선언하면됩니다.

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

Days::type day = Days::Saturday;
if (day == Days::Saturday)


답변

많은 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;
}


답변

여전히 C ++ 03을 사용하고 열거 형을 사용하려면 네임 스페이스 내에서 열거 형을 사용해야합니다. 예 :

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

네임 스페이스 외부에서 열거 형을 사용할 수 있습니다.

Daysofweek::Days day = Daysofweek::Saturday;

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


답변

C ++ 11 에서 사용할 수있는 강력한 형식의 열거 형을 찾고 있습니다. 표준 있습니다. 열거를 범위 값이있는 클래스로 바꿉니다.

자신의 코드 예제를 사용하면 다음과 같습니다.

  enum class Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday};
  Days day = Days::Saturday;

  if (day == Days::Saturday)  {
    cout << " Today is Saturday !" << endl;
  }
  //int day2 = Days::Sunday; // Error! invalid

::C ++ 표준 이전 C ++ 11을 대상으로하는 경우 접근자를 열거 자로 사용 하면 실패합니다. 그러나 일부 오래된 컴파일러는 지원하지 않으며 일부 IDE는이 옵션을 무시하고 오래된 C ++ 표준을 설정합니다.

GCC를 사용하는 경우 -std = c ++ 11 또는 -std = gnu11로 C + 11을 활성화 하십시오 .

행복하세요!