Enum 대 강력한 형식의 열거 형
저는 C ++ 프로그래밍의 초보자입니다.
오늘 저는 새로운 주제 인 strong typed를 발견했습니다 enum
. 나는 그것을 조금 조사했지만 지금까지 이것이 왜 필요한지 그리고 같은 용도가 무엇인지 알 수 없습니다.
예를 들어 다음과 같은 경우 :
enum xyz{a, b, c};
/*a = 0, b = 1, c = 2, (Typical C format)*/
왜 다음과 같이 작성해야합니까?
enum class xyz{a, b, c};
여기서 무엇을하려고합니까? 나의 가장 중요한 의심은 그것을 사용하는 방법입니다. 제가 이해할 수 있도록 작은 예를 들어 주시겠습니까?
예, 첫 번째 예 : 이전 스타일 열거 형에는 자체 범위가 없습니다.
enum Animals {Bear, Cat, Chicken};
enum Birds {Eagle, Duck, Chicken}; // error! Chicken has already been declared!
enum class Fruits { Apple, Pear, Orange };
enum class Colours { Blue, White, Orange }; // no problem!
둘째, 암시 적으로 정수 유형으로 변환되어 이상한 동작이 발생할 수 있습니다.
bool b = Bear && Duck; // what?
마지막으로 C ++ 11 열거 형의 기본 정수 유형을 지정할 수 있습니다.
enum class Foo : char { A, B, C};
이전에는 기본 유형이 지정되지 않아 플랫폼 간의 호환성 문제가 발생할 수 있습니다. 편집 주석에서 C ++ 11에서 "이전 스타일"열거 형의 기본 정수 유형을 지정할 수도 있다는 것이 지적되었습니다.
이 IBM 페이지 에는 열거 형에 대한 좋은 기사 가 있습니다. 매우 자세하고 잘 작성되어 있습니다. 다음은 간단히 말해서 몇 가지 중요한 사항입니다.
범위가 지정된 열거 형은 완전한 형식 안전성, 잘 정의 된 기본 형식, 범위 문제 및 전달 선언과 같은 일반 열거 형에서 발생하는 대부분의 제한 사항을 해결합니다.
- 범위가 지정된 열거 형의 모든 암시 적 변환을 다른 형식으로 허용하지 않음으로써 형식 안전성을 얻을 수 있습니다.
- 새 범위가 생기고 열거 형이 더 이상 둘러싸는 범위에 포함되지 않아 이름 충돌이 발생하지 않습니다.
- 범위가 지정된 열거 형은 열거 형의 기본 유형을 지정할 수있는 기능을 제공하며 범위가 지정된 열거 형의 경우 지정하지 않도록 선택하면 기본값은 int입니다.
- 고정 된 기본 형식을 가진 모든 열거 형은 앞으로 선언 될 수 있습니다.
의 값은 C- 열거 형이 아닌 enum class
실제로 유형 입니다.enum class
underlying_type
enum xyz { a, b, c};
enum class xyz_c { d, f, e };
void f(xyz x)
{
}
void f_c(xyz_c x)
{
}
// OK.
f(0);
// OK for C++03 and C++11.
f(a);
// OK with C++11.
f(xyz::a);
// ERROR.
f_c(0);
// OK.
f_c(xyz_c::d);
열거 형 클래스 ( "new enums", "strong enums")는 기존 C ++ 열거 형의 세 가지 문제를 해결합니다.
- 전통적인
enums
적으로 암시 적으로로 변환하여int
누군가 열거 형이 정수로 작동하는 것을 원하지 않을 때 오류를 발생시킵니다. - 전통적인
enums
의 열거자를 주변 범위로 내 보내면 이름 충돌이 발생합니다. - 의 기본 유형을
enum
지정할 수 없으므로 혼동, 호환성 문제가 발생하고 앞으로 선언 할 수 없습니다.
enum class
( "strong enums")은 강력한 형식과 범위가 지정됩니다.
enum Alert { green, yellow, orange, red }; // traditional enum
enum class Color { red, blue }; // scoped and strongly typed enum
// no export of enumerator names into enclosing scope
// no implicit conversion to int
enum class TrafficLight { red, yellow, green };
Alert a = 7; // error (as ever in C++)
Color c = 7; // error: no int->Color conversion
int a2 = red; // ok: Alert->int conversion
int a3 = Alert::red; // error in C++98; ok in C++11
int a4 = blue; // error: blue not in scope
int a5 = Color::blue; // error: not Color->int conversion
Color a6 = Color::blue; // ok
표시된대로 기존 열거 형은 평소와 같이 작동하지만 이제 선택적으로 열거 형 이름으로 한정 할 수 있습니다.
새로운 열거 형은 기존 열거 형 (이름 값)의 측면과 클래스 측면 (범위가 지정된 멤버 및 변환 없음)을 결합하기 때문에 "열거 형 클래스"입니다.
기본 유형을 지정할 수 있으므로 상호 운용성이 더 간단하고 열거 크기가 보장됩니다.
enum class Color : char { red, blue }; // compact representation
enum class TrafficLight { red, yellow, green }; // by default, the underlying type is int
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U }; // how big is an E?
// (whatever the old rules say;
// i.e. "implementation defined")
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U }; // now we can be specific
또한 열거 형을 앞으로 선언 할 수 있습니다.
enum class Color_code : char; // (forward) declaration
void foobar(Color_code* p); // use of forward declaration
// ...
enum class Color_code : char { red, yellow, green, blue }; // definition
기본 유형은 부호있는 또는 부호없는 정수 유형 중 하나 여야합니다. 기본값은int
입니다.
표준 라이브러리에서 enum
클래스는 다음 용도로 사용됩니다.
- 매핑 시스템 특정 오류 코드 : In
<system_error>
:enum class errc
; - 포인터 안전 표시기 : In
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- I / O 스트림 오류 : 입력
<iosfwd>
:enum class io_errc { stream = 1 };
- Asynchronous communications error handling: In
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Several of these have operators, such as ==
defined.
Enum Scope
Enumerations export their enumerators to the surrounding scope. This has two drawbacks. First, it can lead to name clashes, if two enumerators in different enums declared in the same scope have the same name; second, it's not possible to use an enumerator with a fully qualified name, including the enum name.
enum ESet {a0, a, a1, b1, c3};
enum EAlpha{a, b, c}
select = ESet::a; // error
select = a; // is ambigious
참고URL : https://stackoverflow.com/questions/12581064/enum-vs-strongly-typed-enum
'Nice programing' 카테고리의 다른 글
Bundler : Gemfile을 변경 한 후 배포 모드로 설치하려고합니다. (0) | 2020.10.07 |
---|---|
equals 메소드없이 두 클래스에서 동등성을 어떻게 주장합니까? (0) | 2020.10.07 |
"NUL"문자 제거 (0) | 2020.10.07 |
비어 있지 않은 PSR-4 접두사는 네임 스페이스 구분자로 끝나야합니다. (0) | 2020.10.07 |
jQuery .load () 호출이로드 된 HTML 파일에서 JavaScript를 실행하지 않습니다. (0) | 2020.10.07 |