海鹰是什么类型的?标志变量?
在标准c++中,枚举不是类型安全的。它们是有效的整数。
AnimalFlags不应该是变量的类型。你的变量应该是int,错误就会消失。
不需要像其他人建议的那样输入十六进制值。这没什么区别。
enum值默认为int类型。所以你当然可以将它们按位或组合在一起并将结果存储在int类型中。
枚举类型是int的一个受限子集,其值是它的枚举值之一。因此,当您在该范围之外创建一些新值时,如果不将其强制转换为枚举类型的变量,则不能将其赋值。
如果愿意,还可以更改枚举值类型,但这个问题没有意义。
编辑:发帖者说他们关心类型安全,他们不想要一个不应该存在于int类型中的值。
但是在AnimalFlags类型的变量中放置一个超出AnimalFlags范围的值是类型不安全的。
有一种安全的方法来检查超出范围的值,尽管是在int类型内…
int iFlags = HasClaws | CanFly;
//InvalidAnimalFlagMaxValue-1 gives you a value of all the bits
// smaller than itself set to 1
//This check makes sure that no other bits are set.
assert(iFlags & ~(InvalidAnimalFlagMaxValue-1) == 0);
enum AnimalFlags {
HasClaws = 1,
CanFly =2,
EatsFish = 4,
Endangered = 8,
// put new enum values above here
InvalidAnimalFlagMaxValue = 16
};
上面所述并不能阻止您从值为1、2、4或8的不同enum中放置无效标志。
如果你想要绝对的类型安全,那么你可以简单地创建一个std::set并将每个标志存储在里面。它没有空间效率,但它是类型安全的,并为您提供了与bitflag int相同的功能。
c++ 0x注意:强类型枚举
在c++ 0x中,您终于可以拥有类型安全的enum值....
enum class AnimalFlags {
CanFly = 2,
HasClaws = 4
};
if(CanFly == 2) { }//Compiling error