Подтвердить что ты не робот

Как использовать значение enum для оператора switch в С++

Я хотел бы использовать значение enum для оператора switch. Возможно ли использовать значения enum, заключенные в "{}" в качестве вариантов для switch() "? Я знаю, что switch() требуется значение int eger, чтобы направить поток программирования на соответствующий case number. Если это так, я просто делаю переменную для каждой константы в инструкции enum? Я также хочу, чтобы пользователь мог выбрать выбор и передать этот выбор в оператор switch().

Например:

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

Ответ 1

Вы можете использовать перечислимое значение точно так же, как целое число:

myChoice c;

...

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

Ответ 2

Ты на правильном пути. Вы можете прочитать ввод пользователя в целое число и switch на нем:

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

Ответ 3

Некоторые примечания:

Вы всегда должны объявлять свое перечисление в пространстве имен, поскольку перечисления не являются правильными пространствами имен, и у вас возникнет соблазн использовать их как один.

Всегда иметь разрыв в конце каждого предложения кластера, выполнение в дальнейшем будет продолжаться до конца.

Всегда включайте случай default: в свой коммутатор.

Используйте переменные типа enum для хранения значений перечисления для ясности.

см. здесь для обсуждения правильного использования перечислений в С++.

Это то, что вы хотите сделать.

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

}

Ответ 4

Вы можете использовать std::map для сопоставления ввода с вашим 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;
    }
}

Ответ 5

У меня была аналогичная проблема с использованием перечисления с коммутационными шкафами позже я решил это самостоятельно... ниже скорректированный код, возможно, это может помочь.

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

Ответ 6

  • Примечание. Я знаю, что это не отвечает на этот конкретный вопрос. Но это вопрос, который люди приходят через поисковую систему. Поэтому я публикую это здесь, полагая, что это поможет тем пользователям.

Вы должны иметь в виду, что если вы обращаетесь к общему перечислению из другой функции, даже если это друг, вам нужно предоставить значения с именем класса:

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

Обратите внимание, что это PlayingCard::HEARTS, а не только HEARTS.

Ответ 7

Пользовательский ввод всегда будет предоставлен вам в виде строки символов... если вы хотите преобразовать вход пользователя из строки в целое число, вам нужно будет предоставить код для этого. Если пользователь вводит число (например, "1" ), вы можете передать строку в atoi(), чтобы получить целое число, соответствующее строке. Если пользователь вводит английскую строку (например, "EASY" ), вам необходимо проверить эту строку (например, с помощью strcmp()) и назначить соответствующее целочисленное значение вашей переменной, на основе которой проверяется совпадение. Когда у вас есть целочисленное значение, полученное из строки ввода пользователя, вы можете передать его в оператор switch(), как обычно.

Ответ 8

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