web-dev-qa-db-fra.com

comment utiliser une valeur enum sur une instruction switch en C++

J'aimerais utiliser une valeur enum pour une instruction switch. Est-il possible d’utiliser les valeurs enum incluses dans "{}" comme choix pour switch() "? Je sais que switch() a besoin d’une valeur integer afin de diriger le flux de programmation vers le nombre case approprié. Dans ce cas, est-ce que je crée simplement une variable pour chaque constante dans l'instruction enum? Je souhaite également que l'utilisateur puisse choisir le choix et le transmettre à l'instruction switch()

Par exemple:

cout << "1 - Easy, ";
cout << "2 - Medium, ";
cout << "3 - Hard: ";

enum myChoice { EASY = 1, MEDIUM = 2, HARD = 3 };

cin >> ????

switch(????)
{
case 1/EASY:  // (can I just type case EASY?)
    cout << "You picked easy!";
    break;

case 2/MEDIUM: 
    cout << "You picked medium!";
    break;

case 3/HARD: // ..... (same thing as case 2 except on hard.)

default:
    return 0;
}
32
BotBotPgm

Vous pouvez utiliser une valeur énumérée exactement comme un entier:

myChoice c;

...

switch( c ) {
case EASY:
    DoStuff();
    break;
case MEDIUM:
    ...
}
29
Peter Ruderman

Vous êtes sur la bonne voie. Vous pouvez lire l'entrée de l'utilisateur dans un entier et switch sur celui-ci:

enum Choice
{
  EASY = 1, 
  MEDIUM = 2, 
  HARD = 3
};

int i = -1;

// ...<present the user with a menu>...

cin >> i;

switch(i)
{
  case EASY:
    cout << "Easy\n";
    break;
  case MEDIUM:
    cout << "Medium\n";
    break;
  case HARD:
    cout << "Hard\n";
    break;
  default:
    cout << "Invalid Selection\n";
    break;
}
17
Adam Holmberg

Quelques points à noter: 

Vous devez toujours déclarer votre énumération dans un espace de noms, car ces énumérations ne sont pas des espaces de nom appropriés et vous serez tenté de les utiliser comme tel. 

Toujours avoir une pause à la fin de chaque clause de commutation, l’exécution se poursuivra jusqu’à la fin, sinon.

Toujours inclure le cas default: dans votre commutateur.

Utilisez des variables de type enum pour conserver les valeurs enum pour plus de clarté.

voir ici pour une discussion sur l'utilisation correcte des énumérations en C++.

C'est ce que tu veux faire.

namespace choices
{
    enum myChoice 
    { 
        EASY = 1 ,
        MEDIUM = 2, 
        HARD = 3  
    };
}

int main(int c, char** argv)
{
    choices::myChoice enumVar;
    cin >> enumVar;
    switch (enumVar)
    {
        case choices::EASY:
        {
            // do stuff
            break;
        }
        case choices::MEDIUM:
        {
            // do stuff
            break;
        }

        default:
        {
            // is likely to be an error
        }
    };

}
8
radman

Vous pouvez utiliser un std::map pour mapper l'entrée sur votre enum:

#include <iostream>
#include <string>
#include <map>
using namespace std;

enum level {easy, medium, hard};
map<string, level> levels;

void register_levels()
{
    levels["easy"]   = easy;
    levels["medium"] = medium;
    levels["hard"]   = hard;
}

int main()
{
    register_levels();
    string input;
    cin >> input;
    switch( levels[input] )
    {
    case easy:
        cout << "easy!"; break;
    case medium:
        cout << "medium!"; break;
    case hard:
        cout << "hard!"; break;
    }
}
6
AraK

j'avais un problème similaire en utilisant enum avec des boîtiers de commutateur.

     //Menu Chooser Programe using enum
     #include<iostream>
     using namespace std;
     int main()
     {
        enum level{Novice=1, Easy, Medium, Hard};
        level diffLevel=Novice;
        int i;
        cout<<"\nenter a level: ";
        cin>>i;
        switch(i)
        {
        case Novice: cout<<"\nyou picked Novice\n"; break;
        case Easy: cout<<"\nyou picked Easy\n"; break;
        case Medium: cout<<"\nyou picked Medium\n"; break;
        case Hard: cout<<"\nyou picked Hard\n"; break;
        default: cout<<"\nwrong input!!!\n"; break;
        }
        return 0;
     }
2
Aman Singh
  • Remarque: je sais que cela ne répond pas à cette question spécifique. Mais c'est une question à laquelle les gens viennent via un moteur de recherche. Donc, je poste ceci ici en pensant que cela aidera ces utilisateurs.

N'oubliez pas que si vous accédez à une énumération de classe entière à partir d'une autre fonction, même s'il s'agit d'un ami, vous devez fournir des valeurs avec un nom de classe:

class PlayingCard
{
private:
  enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
  int rank;
  Suit suit;
  friend std::ostream& operator<< (std::ostream& os, const PlayingCard &pc);
};

std::ostream& operator<< (std::ostream& os, const PlayingCard &pc)
{
  // output the rank ...

  switch(pc.suit)
  {
    case PlayingCard::HEARTS:
      os << 'h';
      break;
    case PlayingCard::DIAMONDS:
      os << 'd';
      break;
    case PlayingCard::CLUBS:
      os << 'c';
      break;
    case PlayingCard::SPADES:
      os << 's';
      break;
  }
  return os;
}

Notez que c'est PlayingCard::HEARTS et pas seulement HEARTS.

2
v010dya
#include <iostream>
using namespace std;

int main() {

    enum level {EASY = 1, NORMAL, HARD};

    // Present menu
    int choice;
    cout << "Choose your level:\n\n";
    cout << "1 - Easy.\n";
    cout << "2 - Normal.\n";
    cout << "3 - Hard.\n\n";
    cout << "Choice --> ";
    cin >> choice;
    cout << endl;

    switch (choice) {
    case EASY:
        cout << "You chose Easy.\n";
        break;
    case NORMAL:
        cout << "You chose Normal.\n";
        break;
    case HARD:
        cout << "You chose Hard.\n";
        break;
    default:
        cout << "Invalid choice.\n";
    }

    return 0;
}
0
bornhusker

L'entrée de l'utilisateur vous sera toujours donnée sous la forme d'une chaîne de caractères ... si vous voulez convertir l'entrée de l'utilisateur d'une chaîne en un entier, vous devez fournir le code pour le faire. Si l'utilisateur tape un nombre (par exemple, "1"), vous pouvez passer la chaîne à atoi () pour obtenir le nombre entier correspondant à la chaîne. Si l'utilisateur tape une chaîne anglaise (par exemple, "EASY"), vous devrez alors vérifier cette chaîne (par exemple, avec strcmp ()) et attribuer la valeur entière appropriée à votre variable en fonction des correspondances de vérification. Une fois que vous avez obtenu une valeur entière dérivée de la chaîne de saisie de l'utilisateur, vous pouvez la transmettre dans l'instruction switch () comme d'habitude.

0
Jeremy Friesner