シンプルなじゃんけんゲームを作成しており、列挙データ構造を使用する必要があります。私の問題は、int (userInput) から Throws (userThrow) への変換が無効なため、次のコードをコンパイルできないことです。
enum Throws {R, P, S};
int userInput;
cout << "What is your throw : ";
cin >> userInput;
Throws userThrow = userInput;
ヘルプ?!
次のように実行できます。
int userInput;
std::cin >> userInput;
Throws userThrow = static_cast<Throws>(userInput);
R、P、および S は、技術的には数値の識別子 (それぞれ 0、1、および 2) になりました。プログラムは、0、1、および 2 が文字または文字列にマップされたことを認識していません。
代わりに、入力を取得して手動で「R」、「P」、および「S」と比較し、一致する場合はそれuserThrow
に応じて変数を設定する必要があります。
これを試してください:
enum Throws {R = 'R', P = 'P', S = 'S'};
char userInput;
cout << "What is your throw : ";
cin >> userInput;
Throws userThrow = (Throws)userInput;
列挙型はコンパイラによって整数として扱われるため、ASCII コードに対応するように各列挙型の整数を手動で設定し、整数入力を列挙型にキャストする必要があります。
C++ の列挙型は単なる整数定数です。それらはコンパイル時に解決され、数値に変換されます。
>>
正しい列挙項目を探して正しい変換を行うには、演算子をオーバーライドする必要があります。このリンクは便利だと思いました。
基本的に、stdin から int を読み取り、それを使用して を使用してThrows
アイテムを作成しますThrows(val)
。
代わりに、文字列を入力として配置して enum フィールドの表現を直接入力したい場合は、それ自体は存在しません。最初に述べたように、enum 名はコンパイル時に消えるため、手動で行う必要があります。時間。
これを試すことができます:
int userOption;
std::cin >> userOption;
ユーザー入力データを割り当てたくない場合は、確認したいだけで、以下のコードを使用してください
Throws userThrow = static_cast<Throws>(userOption);
列挙型にユーザー入力を割り当てたい場合は、次のコードを使用します
Throws R = static_cast<Throws>(userOption);
ここでは、必要に応じて R または P または S を選択します。