2011-03-11 2 views
7

아래와 같은 클래스와 주어진 유니온이 주어지면 유니온을 올바른 값으로 초기화하는 방법은 무엇입니까?클래스 이니셜 라이저에서 공용체를 설정하는 방법은 무엇입니까?

여기서 시도되는 것은 두 개 이상의 다른 유형을 클래스의 핵심 데이터 유형 중 하나로 사용하는 것입니다. void *를 사용하는 대신, 타입이 미리 알려지기 때문에 사용하려고하는 타입의 합집합이 생성됩니다. 문제는 클래스가 인스턴스화 될 때 올바른 공용 멤버를 초기화하는 방법입니다. 유형은 다형성이 아니기 때문에 일반적인 상속 모델이 적절하지 않은 것으로 보입니다. 올바른 노조원을 초기화하려는 순진한 시도는 아무데도 이르지 못했습니다.

union Union { 
    int n; 
    char *sz; 
}; 

class Class { 
    public: 
    Class(int n): d(1.0), u(n) {} 
    Class(char *sz): d(2.0), u(sz) {} 
    .... 
    double d; 
    Union u; 
}; 

는 해결책을 수색 한 후, 대답은 분명되었고, 아마도 답변이 저장소에 대한 좋은 해결책이 될 수있다, 그래서 아래에 포함되어 있습니다.

답변

9

생성자가없는 모든 유형의 경우 조합으로 초기화 할 수있는 것으로 나타났습니다. 이 answer on union initializers은 솔루션에 대한 힌트를 제공합니다.

union Union { 
    int n; 
    char *sz; 
    Union(int n): n(n) {} 
    Union(char *sz): sz(sz) {} 
}; 

이제 예상대로 작동합니다. 당신이 무엇을 찾을 지 안다면 분명합니다.

편집 : 클래스 생성자의 공용체에서 사용 된 유형을 일반적으로 int 등으로 기록 할 수도 있습니다.

관련 문제