it-swarm.com.de

wie verwende ich einen Enumerationswert für eine switch-Anweisung in C++

Ich möchte einen enum-Wert für eine switch-Anweisung verwenden. Ist es möglich, die in "{}" eingeschlossenen enum-Werte als Auswahlmöglichkeiten für die switch() "zu verwenden? Ich weiß, dass switch() einen integer-Wert benötigt, um den Programmierfluss auf die entsprechende case-Nummer zu lenken eine Variable für jede Konstante in der enum-Anweisung? Ich möchte auch, dass der Benutzer die Auswahl treffen kann und diese Wahl an die switch()-Anweisung übergeben kann. 

Zum Beispiel:

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

Sie können einen Aufzählungswert wie eine ganze Zahl verwenden:

myChoice c;

...

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

Du bist auf dem richtigen Weg. Sie können die Benutzereingabe in eine Ganzzahl und switch lesen:

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

Einige Dinge zu beachten: 

Sie sollten Ihr Enum immer innerhalb eines Namespaces deklarieren, da Enums keine richtigen Namespaces sind, und Sie werden versucht sein, sie wie eines zu verwenden. 

Am Ende jeder Switch-Klausel wird immer eine Pause ausgeführt, andernfalls wird sie bis zum Ende fortgesetzt.

Schließen Sie immer den Fall default: in Ihren Switch ein.

Verwenden Sie Variablen des Aufzählungstyps, um die Aufzählungswerte zur Verdeutlichung zu speichern.

siehe hier für eine Diskussion der korrekten Verwendung von Enums in C++.

Das wollen Sie tun.

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

Sie können einen std::map verwenden, um die Eingabe Ihrer enum zuzuordnen:

#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

ich hatte ein ähnliches Problem bei der Verwendung von Enum mit Switch-Fällen. Später löste ich es selbst. Unten ist der korrigierte Code.

     //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
  • Hinweis: Ich weiß, dass diese spezifische Frage nicht beantwortet wird. Aber es ist eine Frage, zu der die Leute über eine Suchmaschine kommen. Ich poste dies hier und glaube, dass es diesen Benutzern helfen wird.

Beachten Sie, dass Sie, wenn Sie von einer anderen Funktion aus auf eine klassenweite Enumeration zugreifen, auch wenn es sich um einen Freund handelt, Werte mit einem Klassennamen angeben müssen:

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;
}

Beachten Sie, wie es PlayingCard::HEARTS ist und nicht nur 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

Die Eingabe des Benutzers wird Ihnen immer in Form einer Zeichenfolge übergeben. Wenn Sie die Eingabe des Benutzers von einer Zeichenfolge in eine Ganzzahl konvertieren möchten, müssen Sie dazu den Code angeben. Wenn der Benutzer eine Zahl eingibt (z. B. "1"), können Sie den String an atoi () übergeben, um die dem String entsprechende Ganzzahl zu erhalten. Wenn der Benutzer eine englische Zeichenfolge eingibt (z. B. "EASY"), müssen Sie nach dieser Zeichenfolge suchen (z. B. mit strcmp ()) und Ihrer Variablen den entsprechenden ganzzahligen Wert zuweisen, je nachdem, welche Prüfung übereinstimmt. Wenn Sie einen ganzzahligen Wert haben, der von der Eingabezeichenfolge des Benutzers abgeleitet wurde, können Sie ihn wie üblich an die switch () - Anweisung übergeben.

0
Jeremy Friesner