Comment utiliser les énumérations en C++
Supposons que nous avons un enum
comme suit:
enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday};
Je veux créer une instance de cette enum
et de l'initialiser avec une valeur correcte, donc je ne l':
Days day = Days.Saturday;
Maintenant, je veux vérifier ma variable d'instance ou un enum
valeur, donc je ne l':
if (day == Days.Saturday)
{
std::cout<<"Ok its Saturday";
}
Qui me donne une erreur de compilation:
erreur: attendu primary-expression before ‘.’ token
Donc, pour être clair, quelle est la différence entre dire:
if (day == Days.Saturday) //Causes compilation error
et
if (day == Saturday)
?
Ce que font ces deux en réalité, l'un est OK et on provoque une erreur de compilation?
- Il n'est pas difficile de Google ", l'utilisation des enums en C++" pour trouver la syntaxe correcte. Il est intéressant de noter que le C++11 a portée énumérations, ainsi que la possibilité de spécifier le type sous-jacent.
- je sais, je veux savoir pourquoi sa me donne l'erreur!
- Ses mercredi ici. Vous avez beaucoup trop d'erreurs de syntaxe pour le compilateur C++. À partir de 'Enum'.
- Parce que les énumérations ne sont pas les mêmes de la syntaxe et de la sémantique) dans les deux langues. La première chose que je fais après avoir obtenu une erreur lorsque vous tentez d'utiliser une fonction dans une nouvelle langue est de regarder la syntaxe (ou si c'est possible) dans cette langue.
- savez , je fais exactement la même chose.heureusement, j'ai eu ma réponse.J'ai aussi mis à jour la question pour être plus claire.Je vous remercie par route;)
- "autant que je sache, les énumérations de déclaration et d'utilisation dans ces deux langues sont les mêmes.". Il est votre problème, là. C# est pas le langage C++. En particulier, ils ont une syntaxe différente pour les énumérations.
- si tout le monde serait d'utiliser google ou un autre sens à la salve de leurs problèmes, il n'y aurait pas de StackOverflow.
- ici, sur un débordement de pile, il est d'AUTANT plus apprécié lorsque vous postez une VRAIE réponse à la question que la moyenne (et bon marché) commentaire.
Vous devez vous connecter pour publier un commentaire.
Ce code est faux:
Parce que
Days
n'est pas étendue, ni objet. C'est un type. Et les Types eux-mêmes n'ont pas membres. Ce que vous avez écrit est l'équivalent destd::string.clear
.std::string
est un type, de sorte que vous ne pouvez pas utiliser.
sur elle. Vous utilisez.
sur un instance d'une classe.Malheureusement, les énumérations sont magiques et donc, l'analogie s'arrête là. Parce qu'avec une classe, vous pouvez faire
std::string::clear
pour obtenir un pointeur vers la fonction de membre, mais en C++03,Days::Sunday
est pas valide. (Ce qui est triste). C'est parce que le C++ est (un peu) vers l'arrière compatible avec C, et C ne sont pas des espaces de noms, de sorte que les énumérations devait être dans l'espace de noms global. Donc la syntaxe est simple:Heureusement, Mike Seymour observe que cette question a été traitée en C++11. Changement
enum
àenum class
et il obtient son propre champ d'application; de sorteDays::Sunday
n'est pas seulement valable, mais est le seulement moyen d'accéder àSunday
. Les jours heureux!enum
àenum class
et il obtient son propre champ d'application; de sorteDays::Sunday
est non seulement valable, mais c'est la seule façon d'accéder àSunday
. Les jours heureux!'.' token
etdot operator
, d'autres que c'est un jeton et pas un opérateur, et il montre le symbole exact, plutôt qu'un nom.enum
, vous pouvez ne pas utiliser d'étendue ou la portée globale (::Saturday
). Si vous avez unenum class
(ce qui est une chose très différente), alors vous pour pour utiliserDays::Saturday
.enum Days { Saturday, Sunday, etc}
ensuite utiliserDays::Saturday
, qui est identique à juste à l'aide deSaturday
car il est un habitué enum. Je pense qu'ils ont fait cela pour maintenir la nouvelle étendue de look (utilisé surenum class
es) régulièrementenum
s trop.Cela sera suffisant pour déclarer votre enum variable et comparer:
Days
n'est pas étendue, ni objet. C'est un type. Et de Types de eux n'ont pas membres.std::string.clear
aussi ne peut pas compiler pour la même raison.enum class
, nouveau en 2011) ont leur propre champ d'application, et sont accessibles à l'aide de la portée de l'opérateur,Days::Saturday
. L'accès des membres de l'opérateur (.
) est seulement utilisé pour l'accès des membres de la classe.Beaucoup de ce devrait vous donner des erreurs de compilation.
Maintenant,
Saturday
,Sunday
, etc. peut être utilisé comme haut-niveau à nu des constantes,etDays
peut être utilisé comme un type:Et, de même, plus tard, à tester:
Ces
enum
les valeurs sont comme nu constantes - ils sont de l'onu-portée - avec un peu d'aide supplémentaire à partir du compilateur: (sauf si vous êtes à l'aide de C++11 énumérer les classes) ils ne sont pas encapsulé comme objet ou de la structure des membres par exemple, et vous ne pouvez pas se référer à eux comme membres deDays
.Vous aurez ce que vous cherchez avec C++11, ce qui introduit un
enum class
:Noter que cette C++ est un peu différente de C dans un couple des manières, l'une est que C nécessite l'utilisation de l'
enum
mot-clé lors de la déclaration d'une variable:Vous pouvez utiliser une astuce pour utiliser les étendues comme vous le souhaitez, il suffit de déclarer enum dans une telle manière:
Plutôt que d'utiliser un tas de si-états, les énumérations se prêtent bien à des instructions de commutation
J'utilise de la enum/commutateur de combinaisons dans le niveau du générateur de je suis la construction de mon jeu.
EDIT: Autre chose, je vois que vous voulez syntaxe similaire à
Vous pouvez le faire en C++:
Voici un exemple très simple:
EnumAppState.h
Somefile.cpp
Cela ne devrait pas en C++:
Jours n'est pas un champ ou un objet qui contient des membres vous pouvez accéder avec l'opérateur point. Cette syntaxe est juste un C#-ism et n'est pas légal en C++.
Microsoft a longtemps maintenu une extension C++ qui permet d'accéder aux identifiants de l'aide de la portée de l'opérateur:
Mais c'est non-standard avant C++11. En C++03 les identificateurs déclarés dans un enum n'existent que dans le même champ d'application que le type enum lui-même.
C++11, c'est légal de se qualifier enum identifiants avec l'enum nom, et introduit également énumérer les classes, ce qui créer un nouveau champ d'application pour les identifiants au lieu de les placer dans les environs de la portée.
Si vous êtes toujours à l'aide de C++03 et souhaitez utiliser les énumérations, vous devriez être en utilisant les énumérations à l'intérieur d'un espace de noms.
Par exemple:
Vous pouvez utiliser l'enum à l'extérieur de l'espace de noms comme,
Vous êtes à la recherche pour Fortement Typé Énumérations, une fonctionnalité disponible dans C++11 standard. Il tourne les énumérations dans des classes avec des valeurs de portée.
À l'aide de votre propre exemple de code, c'est :
À l'aide de
::
que des accesseurs pour les énumérations échoue si la cible d'un standard C++ avant C++11. Mais certains vieux compilateurs n'est pas pris en charge, ainsi quelques IDEs de substituer cette option, et de définir un vieux C++ std.Si vous utilisez gcc, activer le C ++ 11 avec -std=c++11 ou -std=gnu11 .
Être heureux !
enum class Days { ...
.Malheureusement, les éléments de l'énumération sont "mondial". Vous y avez accès en faire
day = Saturday
. Cela signifie que vous ne pouvez pas avoirenum A { a, b } ;
etenum B { b, a } ;
car ils sont en conflit.enum class
en C++11, c'est. Avant cela, vous avez à faire mannequin classes.Enum en C++ sont comme des entiers masqués par les noms que vous leur donnez, lorsque vous déclarez votre enum-valeurs (ce n'est pas une définition de seulement un soupçon de comment ça fonctionne).
Mais il y a deux erreurs dans votre code:
enum
en bas de casseDays.
avant samedi.if (day == YourClass::Saturday){}
Tandis que le C++ (à l'exclusion de C++11) a énumérations, les valeurs sont "fuite" dans l'espace de noms global.
Si vous ne voulez pas avoir de fuite (et n'ont pas BESOIN d'utiliser le type enum), considérez les points suivants:
Je pense que votre problème de base est l'utilisation de
.
au lieu de::
, qui va utiliser l'espace de noms.Essayer:
Days::
étendue que dans votre exemple, vous devez définir l'énumération avecenum class Days
et utiliser C++03+extension Microsoft ou C++11.-std=c++98
ou-std=c++03
. Clang est tout à fait clair:warning: use of enumeration in a nested name specifier is a C++11 extension
.Tout d'abord, faire un " E "dans une énumération, un" e " comme un moindre cas.
Second, chute de nom de type 'Jours' dans 'Jours.Samedi'.
Troisième ...achetez-vous un bon C++ livre.