cin & gt; & gt; операнд не может работать с enum

Это код, который я сделал для практики. когда я компилирую это, он не позволяет компилировать выбор cin >>. Это говорит «Ошибка 2 ошибка C2088: ‘>>’: недопустимо для класса» а также «Ошибка 1 ошибка C2371: «выбор»: переопределение; разные основные типы«Могу ли я получить совет о том, как решить эту проблему?

#include <iostream>

using namespace std;

int main()
{
cout << "Difficulty levels\n\n";
cout << "Easy - 0\n";
cout << "Normal - 1\n";
cout << "Hard - 2\n";

enum options { Easy, Normal, Hard, Undecided };
options choice = Undecided;
cout << "Your choice: ";
int choice;
cin >> choice;

switch (choice)
{
case 0:
cout << "You picked Easy.\n";
break;
case 1:
cout << "You picked Normal. \n";
break;
case 2:
cout << "You picked Hard. \n";
break;
default:
cout << "You made an illegal choice.\n";
}

return 0;
}

2

Решение

Там написано «Ошибка 2, ошибка C2088:« >> »: недопустимо для класса» и «Ошибка 1, ошибка C2371:« выбор »: переопределение; различные основные типы». Могу ли я получить совет, как решить эту проблему?

Конечно, давайте посмотрим, что вы написали:

...
options choice = Undecided;
// ^^^^^^^^^^^
cout << "Your choice: ";
int choice;
// ^^^^^^^^
cin >> choice;
..

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

Решение состоит в том, чтобы удалить первое, так что вы бы написали это в целом (с исправленным уродливым отступом):

main.cpp

#include <iostream>

using namespace std;

int main()
{
enum options { Easy, Normal, Hard, Undecided };
cout << "Difficulty levels\n\n";
cout << "Easy - " << Easy << "\n";
cout << "Normal - " << Normal << "\n";
cout << "Hard - " << Hard << "\n";
cout << "Your choice: ";
int choice;
cin >> choice;

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

return 0;
}

Выход

g++ main.cpp && ./a.out
Difficulty levels

Easy - 0
Normal - 1
Hard - 2
Your choice: 0
You picked Easy.
6

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

Вы можете написать свой собственный оператор, чтобы вам не нужно было читать целое число — вот один из подходов:

bool consume(std::istream& is, const char* p)
{
while (*p)
if (is.get() != *p++)
{
is.setstate(std::ios::failbit);
return false;
}
return true;
}

std::istream& operator>>(std::istream& is, options& o)
{
switch (is.get())
{
case 'E': if (consume(is, "asy") { o = Easy; return is; } break;
case 'H': if (consume(is, "ard") { o = Hard; return is; } break;
case 'N': if (consume(is, "ormal") { o = Normal; return is; } break;
case 'U': if (consume(is, "ndecided") { o = Undecided; return is; } break;
}
is.setstate(std::ios::failbit);
return is;
}

Точно так же вы можете написать оператор вывода:

std::ostream& operator<<(std::ostream& os, options o)
{
return os << (o == Easy ? "Easy" :
o == Hard ? "Hard" :
o == Normal ? "Normal" :
o == Undecided ? "Undecided" :
"<invalid option>");
}

Они позволяют:

enum options { Easy, Normal, Hard, Undecided };

...streaming operators go here...

int main()
{
cout << "Difficulty levels\n\n";
cout << "Easy\n";
cout << "Normal\n";
cout << "Hard\n";

options choice = Undecided;
cout << "Your choice: ";
if (cin >> choice)
cout << "You picked " << choice << '\n';
else
cout << "Error while reading your choice.\n";
}
4

По вопросам рекламы [email protected]