올바른 값을 C ++ 열거 유형 변수에 할당 할 수없는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/19835143

문제

거기에 무슨 일이 일어나고 있는지 이해할 수 없습니다. Visual Studio 2008을 사용하여 다음과 같은 열거를 정의했습니다.

enum MyType{
    A,
    B,
    C
};

그런 다음이를 사용하여 멤버 변수를 초기화합니다.

class MyClass
{
    private:
        bool   bit_;
        uint16 num_;
        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // This the assignment which fails
        } // Here, there's a breakpoint to query member_ value    
};

myClass instance = new MyClass ();

디버그 구성을 사용하고 있으므로 변수를 읽을 때 최적화가 저를 속일 수 없습니다. 과제 직후의 중단 점에서 디버처는 멤버 _의 값을 다음과 같이 표시합니다. member_ = C.

디버거 whatch 새로 고침 문제 일 수 있지만 메소드 내에서는 확인할 때 TRUE를 평가합니다.

if(member_ == C){
    // ??
}

또한 다른 값에 할당하면 이상한 숫자가됩니다. member_ = B 주어진 member_ = 258 그것을 막을 때. 무엇이 잘못되었는지 말해 줄 수 있습니까? 미리 감사드립니다.

#1 편집

나는 할당 한 후에 이유를 설명하는 재미있는 효과를 언급했다. member_ = A 표현식 member_ == C 평가합니다 true 기본값이있는 열거의 경우 :

열거

enum MyType{ A, B, C}; // equivalent to enum MyType{ A = 0, B = 1, C = 2};

나는 얻다

MyType  a = A; // but when fetching a the value is   2  (0x0002)  thats the map for C!
MyType  b = B; // but when fetching a the value is 258  (0x0102)
MyType  c = C; // but when fetching a the value is 514  (0x0202)

하지만 내가 만든다면

enum MyType{ A = 5, B = 6, C = 7};

나는 얻다

MyType  a = A; // but when fetching a the value is 1282  (0x0502)
MyType  b = B; // but when fetching a the value is 1538  (0x0602)
MyType  c = C; // but when fetching a the value is 1794  (0x0702)

따라서 해당 #?!^% enum을 할당 할 때 규칙은 8 비트를 이동하고 2를 추가하는 것 같습니다. 컴파일러 문제처럼 들립니다.

BTW, 유형 만들기 member_ 되려고 int 대신에 MyType 아무것도 바꾸지 않습니다.

#2 편집수업에 두 명의 회원이 추가되었는데, 이는 문제의 실제 원인입니다. 시간 제한이 사라지 자마자 답을 게시하겠습니다 (질문 게시에서 8 시간).

도움이 되었습니까?

해결책 2

모두 감사합니다. 직장에서 누군가가 문제의 기원을 지적했습니다.

데이터 정렬 문제를 제공하는 프로젝트 구성이 잘못된 문제입니다.

컴파일 후 현재 프로젝트 설정으로 클래스의 첫 번째 멤버는 3 바이트 크기입니다.

4 바이트 여야하므로 1 바이트의 오정렬입니다. 추가 2 첨가는 잘못 정렬 된 바이트에서 쓰레기이므로 전체 효과는 하나의 바이트를 이동하고 2를 추가하는 것입니다.

이 효과는 우아한 솔루션이 아니지만 추가 회원을 추가하는 데있어 취소되었습니다 (솔루션은 프로젝트를 끊임없이 구성하는 것입니다).

class MyClass
{
    private:
        bool   bit_;  // 1 byte
        uint16 num_;  // 2 byte

        bool dummy;   // extra byte to help the alignment

        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // Now it works as expected.
        }
};

다른 팁

열거 항목에는 고유 한 값이 필요하지 않습니다. A, B, C가있는 열거가있을 수 있으며 여기서 A와 C는 모두 '42'입니다. 이 경우 VAR의 값이 42 인 경우 IDE 하나만 보여줄 것입니다 일치하는 항목의 A 또는 C는 둘 다 아닙니다.

다음과 같은 '중복'항목으로 열거를 쉽게 만들 수 있습니다.

enum { A=1, B=1, C=1 }

그러나 아마도 당신은 그렇게하지 않았을 것입니다. 그러나 Autonumbering을 사용할 때 우연히 (또는 의도적으로) 복제물을 만들 수도 있습니다.

enum { A, B, C }       // 0,1,2
enum { A, B, C=0 }     // 0,1,0
enum { A=2, B=1, C }   // 2,1,2
enum { A=-1, B, C=0 }  // -1,0,0

열거 정의를 다시 확인하십시오.

IE 참조 http://www.learncpp.com/cpp-tutorial/45-enumerated-types/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top