我不明白那里发生了什么。使用 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 实例 = new MyClass();
我正在使用调试配置,因此在读取变量时没有任何优化可以欺骗我。在赋值后的断点处,调试器将 member_ 的值显示为member_ = C
。
这可能是一个调试器刷新问题,但是,在一个方法中,它在检查时评估为真:
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)
因此,在分配 #?!^% 枚举时,规则似乎是,移动 8 位并加 2。这听起来像是编译器问题。
顺便说一句,将类型改为member_
to并不会改变任何内容。int
MyType
编辑#2 向班级添加了另外两个成员,这是问题的真正原因。一旦时间限制消失(发布问题后 8 小时),我将发布答案。