Quel est le type de la variable seahawk.flags ?
Dans le C++ standard, les énumérations ne sont pas sûres au niveau du type. Elles sont effectivement des entiers.
AnimalFlags ne doit PAS être le type de votre variable. Votre variable doit être int et l'erreur disparaîtra.
Il n'est pas nécessaire de mettre des valeurs hexadécimales comme l'ont suggéré d'autres personnes. Cela ne fait aucune différence.
Les valeurs de l'enum sont de type int par défaut. Ainsi, vous pouvez sûrement les combiner par OU binaire, les assembler et stocker le résultat dans un int.
Le type énumération est un sous-ensemble restreint de int dont la valeur est l'une de ses valeurs énumérées. Par conséquent, lorsque vous créez une nouvelle valeur en dehors de cette plage, vous ne pouvez pas l'affecter sans faire un casting vers une variable de votre type enum.
Vous pouvez également modifier les types de valeurs de l'enum si vous le souhaitez, mais cette question n'a aucun intérêt.
EDIT : Le posteur a dit qu'il était préoccupé par la sécurité des types et qu'il ne voulait pas d'une valeur qui ne devrait pas exister dans le type int.
Mais il serait dangereux de mettre une valeur en dehors de la plage de AnimalFlags dans une variable de type AnimalFlags.
Il existe un moyen sûr de vérifier les valeurs hors limites à l'intérieur du type 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
};
Ce qui précède ne vous empêche pas de mettre un drapeau invalide d'un enum différent qui a la valeur 1, 2, 4 ou 8.
Si vous voulez une sécurité de type absolue, vous pouvez simplement créer un std::set et y stocker chaque drapeau. Ce n'est pas efficace en termes d'espace, mais c'est sûr au niveau des types et cela vous donne les mêmes possibilités qu'un int bitflag.
Note C++0x : Enums fortement typés
En C++0x, il est enfin possible d'avoir des valeurs d'énumération sans risque pour les types.....
enum class AnimalFlags {
CanFly = 2,
HasClaws = 4
};
if(CanFly == 2) { }//Compiling error
0 votes
Pour autant que je sache, dans Visual C++ 2013, la fonction
[Flags]
fonctionne très bien, par exemple :[Flags] enum class FlagBits{ Ready = 1, ReadMode = 2, WriteMode = 4, EOF = 8, Disabled = 16};
0 votes
@rivanov, Non cela ne fonctionne pas avec C++ (2015 aussi). Voulez-vous dire C# ?
6 votes
@rivanov, L'attribut [Flags] ne fonctionne qu'avec le Framework .Net dans C++CLI, le C++ natif ne supporte pas de tels attributs.