UFO ET IT

C ++에서 열거 형 확장?

ufoet 2020. 11. 8. 11:36
반응형

C ++에서 열거 형 확장?


C ++에서 열거 형을 확장 / "상속"하는 방법이 있습니까?

IE :

enum Enum {A,B,C};
enum EnumEx : public Enum {D,E,F};

아니면 적어도 그들 사이의 변환을 정의합니까?


아니 없어.

enum C ++에서 정말 가난하고 불행한 일입니다.

심지어 class enum(그들은 적어도 타입의 안전을 위해 어떤 일을하더라도)이 확장 성 문제를 해결하지 않는 C ++ 0X에 소개했다.

의 유일한 장점은 enum이들이 존재하지 않는다는 것입니다. 컴파일러에 의해 직접 대체되기 때문에 런타임 오버 헤드를 부과하지 않으면 서 일부 유형 안전성을 제공합니다.

그런 짐승을 원한다면 스스로 일해야 할 것입니다.

  • MyEnumint (기본적으로)를 포함하는 클래스를 만듭니다.
  • 각 흥미로운 값에 대해 명명 된 생성자를 만듭니다.

이제 원하는대로 클래스를 확장 할 수 있습니다 (명명 된 생성자 추가).

그것은 해결 방법이지만 열거를 처리하는 만족스러운 방법을 찾지 못했습니다 ...


열거 형의 하위 클래스를 만들 수 있다면 다른 방식으로 작업해야합니다.

하위 클래스 의 인스턴스 집합 은 수퍼 클래스에있는 인스턴스 하위 집합 입니다. 표준 "모양"예를 생각해보십시오. Shape 클래스는 모든 Shape의 집합을 나타냅니다. Circle 클래스의 하위 클래스는 Circles 인 Shape의 하위 집합을 나타냅니다.

따라서 일관성을 유지하기 위해 열거 형의 하위 클래스는 상속 된 열거 형의 요소 하위 집합을 포함해야합니다.

(아니요, C ++는 이것을 지원하지 않습니다.)


이 방법으로 해결했습니다.

typedef enum
{
    #include "NetProtocols.def"
} eNetProtocols, eNP;

물론 NetProtocols.def 파일에 새 넷 프로토콜을 추가하면 다시 컴파일해야하지만 적어도 확장 가능합니다.


이 C ++ 갭에 대한 간단하지만 유용한 해결 방법은 다음과 같습니다.

#define ENUM_BASE_VALS A,B,C
enum Enum {ENUM_BASE_VALS};
enum EnumEx {ENUM_BASE_VALS, D,E,F};

http://www.codeproject.com/KB/cpp/InheritEnum.aspx 는 확장 된 열거 형을 만드는 메서드를 살펴 봅니다.


아이디어 :

각 상수에 대해 빈 클래스를 만들고 (혼잡함을 줄이기 위해 모두 동일한 파일에 넣을 수 있음) 각 클래스의 인스턴스를 하나씩 만들고 이러한 인스턴스에 대한 포인터를 "상수"로 사용할 수 있습니다. 그런 식으로 컴파일러는 상속을 이해하고 함수 호출을 사용할 때 필요한 ChildPointer-ParentPointer 변환을 수행하며, 컴파일러가 여전히 잘못된 int 값을 함수에 전달하지 않도록하는 유형 안전성 검사를받습니다. LAST 값 방법을 사용하여 열거 형을 "확장"하는 경우 사용됩니다.

이 접근 방식에 대한 의견을 환영합니다.

그리고 시간이 생기는대로 제가 의미하는 바의 예를 게시하려고합니다.


다음 코드는 잘 작동합니다.

enum Enum {A,B,C};
enum EnumEx {D=C+1,E,F};

참고 URL : https://stackoverflow.com/questions/1804840/extending-enums-in-c

반응형