237 votes

Comment utiliser Enums en C ++

Supposons que nous ayons une enum comme suit:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday };

Je veux créer une instance de cette enum et l'initialiser avec une valeur correcte, donc je fais:

Days day = Days.Saturday;

Maintenant, je veux vérifier ma variable d'instance ou à un enum de la valeur, ce que je fais:

if(day == Days.Saturday)
{
    std::cout<<"Ok its Saturday";
}

Ce qui me donne une erreur de compilation:

erreur: 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 sont en réalité, que l'on est OK et on provoque une erreur de compilation?

380voto

Mooing Duck Points 27497

Ce code est faux:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
Days day = Days.Saturday;
if(day == Days.Saturday)

Parce que les jours 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 d' std::string.clear. std::string est un type, de sorte que vous ne pouvez pas utiliser . . Vous utilisez . sur une 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 le faire std::string::clear pour obtenir un pointeur vers la fonction de membre, mais en C++03, Days::Sunday n'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 simplement:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
Days day = Saturday;
if(day == Saturday)

26voto

mathematician1975 Points 13448

Cela sera suffisant pour déclarer votre variable enum et la comparer:

 enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
Days day = Saturday;
if(day == Saturday){
    std::cout<<"Ok its Saturday";
}
 

24voto

pb2q Points 28514

Une grande partie de ce devrait vous donner des erreurs de compilation.

// note the lower case enum keyword
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };

Maintenant, Saturday, Sunday, etc. peut être utilisé comme haut-niveau à nu des constantes,et Days peut être utilisé comme un type:

Days day = Saturday;   // Days.Saturday is an error

Et, de même, plus tard, à tester:

if (day == Saturday)
    // ...

Ces enum les valeurs sont comme nu constantes - ils 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ées comme objet ou de la structure des membres par exemple, et vous ne pouvez pas se référer à eux comme membres de l' Days.

Vous aurez ce que vous recherchez avec le C++11, ce qui introduit un enum class:

enum class Days
{
    SUNDAY,
    MONDAY,
    // ... etc.
}

// ...

if (day == Days::SUNDAY)
    // ...

Notez 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:

// day declaration in C:
enum Days day = Saturday;

18voto

ataman1x Points 21

Vous pouvez utiliser une astuce pour utiliser les portées à votre guise, déclarez simplement enum de la manière suivante:

 struct Days 
{
   enum type
   {
      Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday
   };
};

Days::type day = Days::Saturday;
if (day == Days::Saturday)
 

11voto

Dean Knight Points 405

Plutôt que d’utiliser un ensemble d’énoncés if, les enums se prêtent bien pour changer de déclaration

J'utilise des combinaisons enum / switch dans le générateur de niveau que je construis pour mon jeu.

EDIT: Une autre chose, je vois que vous voulez une syntaxe similaire à;

 if(day == Days.Saturday)
etc
 

Vous pouvez le faire en C ++:

 if(day == Days::Saturday)
etc
 

Voici un exemple très simple:

EnumAppState.h

 #ifndef ENUMAPPSTATE_H
#define ENUMAPPSTATE_H
enum eAppState
{
    STARTUP,
    EDIT,
    ZONECREATION,
    SHUTDOWN,
    NOCHANGE
};
#endif
 

Somefile.cpp

 #include "EnumAppState.h"
eAppState state = eAppState::STARTUP;
switch(state)
{
case STARTUP:
    //Do stuff
    break;
case EDIT:
    //Do stuff
    break;
case ZONECREATION:
    //Do stuff
    break;
case SHUTDOWN:
    //Do stuff
    break;
case NOCHANGE:
    //Do stuff
    break;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X