C ++에서 열거 형 확장?
C ++에서 열거 형을 확장 / "상속"하는 방법이 있습니까?
IE :
enum Enum {A,B,C};
enum EnumEx : public Enum {D,E,F};
아니면 적어도 그들 사이의 변환을 정의합니까?
아니 없어.
enum
C ++에서 정말 가난하고 불행한 일입니다.
심지어 class enum
(그들은 적어도 타입의 안전을 위해 어떤 일을하더라도)이 확장 성 문제를 해결하지 않는 C ++ 0X에 소개했다.
의 유일한 장점은 enum
이들이 존재하지 않는다는 것입니다. 컴파일러에 의해 직접 대체되기 때문에 런타임 오버 헤드를 부과하지 않으면 서 일부 유형 안전성을 제공합니다.
그런 짐승을 원한다면 스스로 일해야 할 것입니다.
MyEnum
int (기본적으로)를 포함하는 클래스를 만듭니다.- 각 흥미로운 값에 대해 명명 된 생성자를 만듭니다.
이제 원하는대로 클래스를 확장 할 수 있습니다 (명명 된 생성자 추가).
그것은 해결 방법이지만 열거를 처리하는 만족스러운 방법을 찾지 못했습니다 ...
열거 형의 하위 클래스를 만들 수 있다면 다른 방식으로 작업해야합니다.
하위 클래스 의 인스턴스 집합 은 수퍼 클래스에있는 인스턴스 의 하위 집합 입니다. 표준 "모양"예를 생각해보십시오. 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
'UFO ET IT' 카테고리의 다른 글
C # HasValue 대! = null (0) | 2020.11.08 |
---|---|
IntelliJ IDEA“선택한 디렉토리는 JDK에 유효한 홈이 아닙니다.” (0) | 2020.11.08 |
Kotlin에서 run, let, apply 및 with를 사용해야하는 경우의 예 (0) | 2020.11.07 |
Log4j에 현재 날짜를 포함하도록 로그 파일 이름 설정 (0) | 2020.11.07 |
컴파일러 최적화로 버그가 발생할 수 있습니까? (0) | 2020.11.07 |