Я должен использовать перечисления для представления уровней сложности. Вот код
// Menu Chooser
// Demonstrates the switch statement
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Difficulty Levels\n\n";
cout << "1 - Easy\n";
cout << "2 - Normal\n";
cout << "3 - Hard\n\n";
enum userChoice {Easy, Normal, Hard};
userChoice choice;
cout << "Choice: ";
cin >> choice;
switch (choice)
{
case 1:
cout << "You picked Easy.\n";
break;
case 2:
cout << "You picked Normal.\n";
break;
case 3:
cout << "You picked Hard.\n";
break;
default:
cout << "You made an illegal choice.\n";
}
return 0;
}
и сообщение об ошибке:
ошибка C2678: двоичный файл «>>»: не найден оператор, который занимает левую руку
операнд типа ‘std :: istream’ (или нет приемлемого преобразования)
При чтении пользовательского ввода небезопасно ожидать, что они введут правильное значение. Тем не менее, это кажется крайним для вашего назначения.
Моя первая мысль — просто прочитать в int, а затем привести его к перечислению.
int input;
cin >> input;
userChoice choice = (userChoice)input;
Это должно работать, однако я не проверял это.
Нет реализации по умолчанию >>
оператор для ввода и отображения его на enum
, Вам нужно будет принять в int
в качестве входных данных, а затем сопоставить его с enum
, В качестве альтернативы, вы можете написать перегрузку для >>
оператор, который отображает вход в ваше перечисление.
Конечно, глядя на ваш код, вы, кажется, не используете определенное перечисление ни для чего. Возможно, вы могли бы удалить его и использовать вместо него int?
Вы должны разместить свой enum
ценности в ваш cases
:
switch (choice)
{
case Easy:
cout << "You picked Easy.\n";
break;
case Normal:
cout << "You picked Normal.\n";
break;
case Hard:
cout << "You picked Hard.\n";
break;
default:
cout << "You made an illegal choice.\n";
}
Преобразовать из текста в enum
типа, я предлагаю вам использовать таблицу (ваш инструктор, вероятно, не охватывал тему std::map
который был бы предпочтительным методом).
struct Enum_Entry
{
UserChoice value;
const char * text;
};
static const Enum_Entry lookup_table[] =
{
{Easy, "easy"},
{Normal, "normal"},
{Hard, "hard"},
};
static const unsigned int items_in_table =
sizeof(lookup_table) / sizeof(lookup_table[0]);
std::string selection_text;
// Input enum as text
std::cin >> selection_text;
// Convert to lower case to make comparison easier
std::transform(selection_text.begin(), // Start of range
selection_text.end(), // End of range
selection.begin(), // Destination for transformation.
std::tolower); // Transformation function.
// Lookup the text into the table and retrieve the enum value.
UserChoice choice = Easy;
for (unsigned int i = 0; i < items_in_table; ++i)
{
if (selection_text == lookup_table[i].text)
{
choice = lookup_table[i].value;
break;
}
}
Другой метод заключается в использовании if-else-if
лестница:
choice = easy;
if (selection_text == "easy")
{
choice = Easy;
}
else if (selection_text == "hard")
{
choice = Hard;
}
else if (selection_text == "normal")
{
choice = Normal;
}
else
{
choice = Easy;
}