Мне нужно использовать перечисления для представления уровней сложности. Я получаю сообщение об ошибке при использовании cin & gt; & gt;

Я должен использовать перечисления для представления уровней сложности. Вот код

// 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’ (или нет приемлемого преобразования)

0

Решение

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

Моя первая мысль — просто прочитать в int, а затем привести его к перечислению.

int input;
cin >> input;

userChoice choice = (userChoice)input;

Это должно работать, однако я не проверял это.

0

Другие решения

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

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

2

Вы должны разместить свой 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;
}
1
По вопросам рекламы [email protected]