거기에 무슨 일이 일어나고 있는지 이해할 수 없습니다. 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 시간).