Ответ 1
Вы можете использовать перечислимое значение точно так же, как целое число:
myChoice c;
...
switch( c ) {
case EASY:
DoStuff();
break;
case MEDIUM:
...
}
Я хотел бы использовать значение 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;
}
Вы можете использовать перечислимое значение точно так же, как целое число:
myChoice c;
...
switch( c ) {
case EASY:
DoStuff();
break;
case MEDIUM:
...
}
Ты на правильном пути. Вы можете прочитать ввод пользователя в целое число и 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;
}
Некоторые примечания:
Вы всегда должны объявлять свое перечисление в пространстве имен, поскольку перечисления не являются правильными пространствами имен, и у вас возникнет соблазн использовать их как один.
Всегда иметь разрыв в конце каждого предложения кластера, выполнение в дальнейшем будет продолжаться до конца.
Всегда включайте случай 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
}
};
}
Вы можете использовать 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;
}
}
У меня была аналогичная проблема с использованием перечисления с коммутационными шкафами позже я решил это самостоятельно... ниже скорректированный код, возможно, это может помочь.
//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;
}
Вы должны иметь в виду, что если вы обращаетесь к общему перечислению из другой функции, даже если это друг, вам нужно предоставить значения с именем класса:
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
.
Пользовательский ввод всегда будет предоставлен вам в виде строки символов... если вы хотите преобразовать вход пользователя из строки в целое число, вам нужно будет предоставить код для этого. Если пользователь вводит число (например, "1" ), вы можете передать строку в atoi(), чтобы получить целое число, соответствующее строке. Если пользователь вводит английскую строку (например, "EASY" ), вам необходимо проверить эту строку (например, с помощью strcmp()) и назначить соответствующее целочисленное значение вашей переменной, на основе которой проверяется совпадение. Когда у вас есть целочисленное значение, полученное из строки ввода пользователя, вы можете передать его в оператор switch(), как обычно.
#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;
}