1

我不明白那里发生了什么。使用 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并不会改变任何内容。intMyType

编辑#2 向班级添加了另外两个成员,这是问题的真正原因。一旦时间限制消失(发布问题后 8 小时),我将发布答案。

4

2 回答 2

1

Enum entries does not have to have unique values. You might have an enum with A,B,C where both A and C are equal to '42'. In such case, when the var has value of 42, the IDE will show you only one of the matching entries, A or C, not both.

You can easily create an enum with 'duplicate' entries, like this:

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

But most probably, you didn't do it like that. However, when using autonumbering, you can accidentally (or intentionally) create duplicates too:

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

Be sure to double-check your enum definition.

see i.e. http://www.learncpp.com/cpp-tutorial/45-enumerated-types/

于 2013-11-07T12:03:32.907 回答
1

感谢大家。工作中的某个人向我指出了问题的根源。

这是项目配置错误的问题,这会导致数据对齐问题。

编译后,以当前项目设置,类的前两个成员为 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.
        }
};
于 2013-11-07T21:09:50.940 回答