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에서 해결되었음을 관찰합니다. 변경 enum
에 enum 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을 활성화 하십시오 .
행복하세요!