2012-04-29 2 views
2

Look т этого кода плз:перечисление не может принять команду CIN

#include <iostream> 
using namespace std; 
int main() 
{ 

    enum object {s,k,g}; 
    object o,t; 

    cout << "Player One: "; cin >> o; 
    cout << "Player Two: "; cin >> t; 

    if (o==s && t==g) cout << "The Winner is Player One.\n"; 
    else if (o==k && t==s) cout << "The Winner is Player One.\n"; 
    else if (o==g && t==k) cout << "The Winner is Player One.\n"; 
    else if (o==g && t==s) cout << "The Winner is Player Two.\n"; 
    else if (o==s && t==k) cout << "The Winner is Player Two.\n"; 
    else if (o==k && t==g) cout << "The Winner is Player Two.\n"; 
    else cout << "No One is the Winner.\n"; 
     return 0; 
} 

при компиляции я получаю эту ошибку: не подходит для «оператора >>» в «станд :: CIN >> о» Я использую кодовые блоки. так что не так с этим кодом?

+1

Попробуйте посмотреть здесь: http://stackoverflow.com/questions/9220599/error-no-match-for-operator-in -stdcin-stopat Должен обеспечить некоторое понимание. –

ответ

4

Оператор >>() для перечисления отсутствует. Вы можете реализовать его самостоятельно:

std::istream& operator>>(std::istream& is, object& i) 
{ 
    int tmp ; 
    if (is >> tmp) 
     i = static_cast<object>(tmp) ; 
    return is ; 
} 

Конечно, было бы проще, если бы вы просто зацепили целое число и бросили себя. Просто хочу показать вам, как написать оператор cin >>.

2

Вы ожидаете, что сможете набрать «s», «k» или «g» и проанализировать их в вашем типе перечисления? Если да, то вам необходимо определить свой собственный оператор потока, как это:

std::istream& operator>>(std::istream& is, object& obj) { 
    std::string text; 
    if (is >> text) { 
     if (is == "s") { 
      obj = s; 
     } 
     // TODO: else-if blocks for other values 
     // TODO: else block to set the stream state to failed 
    } 
    return is; 
} 
+1

Если это всего лишь символ, 'char' +' switch' будет упрощать чтение кода. В противном случае, 'unordered_map '. –

+1

Я согласен с коммутатором, но не хочу усложнять свой ответ проверкой ввода длины 1. Я не согласен с использованием unordered_map, хотя, поскольку это не эффективная структура данных для небольших количеств значения. Если вы хотите что-то более управляемое данными, я бы предложил массив std :: pairs и просто использовал std :: find для линейного поиска, если есть только несколько элементов. Легко перейти оттуда к бинарному поиску или даже построить хеш-таблицу, если когда-нибудь будет много тысяч игроков. :) –

+1

Не беспокойтесь об эффективном произношении, 97% времени;) 'unordered_map' предлагает естественный интерфейс для поиска по ключу, поэтому он просто работает из коробки. Если вам нужна эффективность, вам нужно избегать конструкторов и выстраивать массив из POD, чтобы его инициализация выполнялась целиком во время статической инициализации и не требовала никаких вызовов 'malloc' /' new' ... но это дополнительная работа для маленькая награда. KISS говорит: 'unordered_map' или' map'. –

Смежные вопросы