gpt4 book ai didi

c++ - 为什么我不能为 C++ 枚举类型变量分配正确的值?

转载 作者:行者123 更新时间:2023-11-30 04:12:29 24 4
gpt4 key购买 nike

我不明白那里发生了什么。使用 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

这可能是一个调试器 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)

因此,在分配 #?!^% 枚举时,规则似乎是移动 8 位并加 2。这听起来像是编译器问题。

顺便说一句,将 member_ 的类型设为 int 而不是 MyType 不会改变任何内容。

编辑#2向类中添加了两个成员,这是问题的真正原因。我会张贴时间限制消失后立即回答(问题发布后 8 小时)。

最佳答案

枚举条目不必具有唯一值。您可能有一个包含 A、B、C 的枚举,其中 A 和 C 都等于“42”。在这种情况下,当 var 的值为 42 时,IDE 将只显示一个匹配条目,A 或 C,而不是两者。

您可以轻松地创建一个带有“重复”条目的枚举,如下所示:

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

但很可能,您并没有那样做。但是,在使用自动编号时,您也可能会不小心(或有意)创建重复项:

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

请务必仔细检查您的枚举定义。

参见即 http://www.learncpp.com/cpp-tutorial/45-enumerated-types/

关于c++ - 为什么我不能为 C++ 枚举类型变量分配正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19835143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com