web-dev-qa-db-ja.com

C ++のswitchステートメントで列挙値を使用する方法

enumステートメントにswitch値を使用したいと思います。 switch() "の選択肢として"{}"で囲まれたenum値を使用することは可能ですか?switch()にはinteger値が順番に必要であることを知っていますプログラミングの流れを適切なcase番号に向ける場合は、enumステートメントの各定数に対して変数を作成するだけですか?ユーザーに選択させることもできます。選択肢を選択し、その選択肢をswitch()ステートメントに渡します。

例えば:

cout << "1 - Easy, ";
cout << "2 - Medium, ";
cout << "3 - Hard: ";

enum myChoice { EASY = 1, MEDIUM = 2, HARD = 3 };

cin >> ????

switch(????)
{
case 1/EASY:  // (can I just type case EASY?)
    cout << "You picked easy!";
    break;

case 2/MEDIUM: 
    cout << "You picked medium!";
    break;

case 3/HARD: // ..... (same thing as case 2 except on hard.)

default:
    return 0;
}
37
BotBotPgm

整数のように列挙値を使用できます。

myChoice c;

...

switch( c ) {
case EASY:
    DoStuff();
    break;
case MEDIUM:
    ...
}
32
Peter Ruderman

あなたは正しい軌道に乗っています。ユーザー入力を整数に読み取り、その上でswitchを読み取ることができます。

enum Choice
{
  EASY = 1, 
  MEDIUM = 2, 
  HARD = 3
};

int i = -1;

// ...<present the user with a menu>...

cin >> i;

switch(i)
{
  case EASY:
    cout << "Easy\n";
    break;
  case MEDIUM:
    cout << "Medium\n";
    break;
  case HARD:
    cout << "Hard\n";
    break;
  default:
    cout << "Invalid Selection\n";
    break;
}
18
Adam Holmberg

注意するべき事柄:

列挙型は適切な名前空間ではないため、常に名前空間内で列挙型を宣言する必要があります。

各switch節の実行の最後に常にブレークを設定します。それ以外の場合、実行は最後まで下方に続きます。

スイッチには必ずdefault:ケースを含めてください。

明確にするために、列挙型の変数を使用して列挙型の値を保持します。

c ++でのenumの正しい使用方法については、 here を参照してください。

これがあなたがしたいことです。

namespace choices
{
    enum myChoice 
    { 
        EASY = 1 ,
        MEDIUM = 2, 
        HARD = 3  
    };
}

int main(int c, char** argv)
{
    choices::myChoice enumVar;
    cin >> enumVar;
    switch (enumVar)
    {
        case choices::EASY:
        {
            // do stuff
            break;
        }
        case choices::MEDIUM:
        {
            // do stuff
            break;
        }

        default:
        {
            // is likely to be an error
        }
    };

}
8
radman

std::mapを使用して、入力をenumにマッピングできます。

#include <iostream>
#include <string>
#include <map>
using namespace std;

enum level {easy, medium, hard};
map<string, level> levels;

void register_levels()
{
    levels["easy"]   = easy;
    levels["medium"] = medium;
    levels["hard"]   = hard;
}

int main()
{
    register_levels();
    string input;
    cin >> input;
    switch( levels[input] )
    {
    case easy:
        cout << "easy!"; break;
    case medium:
        cout << "medium!"; break;
    case hard:
        cout << "hard!"; break;
    }
}
6
AraK

私はenumをスイッチケースで使用して同様の問題を抱えていましたが、後で自分で解決しました....以下は修正されたコードです。おそらくこれが役立つかもしれません。

     //Menu Chooser Programe using enum
     #include<iostream>
     using namespace std;
     int main()
     {
        enum level{Novice=1, Easy, Medium, Hard};
        level diffLevel=Novice;
        int i;
        cout<<"\nenter a level: ";
        cin>>i;
        switch(i)
        {
        case Novice: cout<<"\nyou picked Novice\n"; break;
        case Easy: cout<<"\nyou picked Easy\n"; break;
        case Medium: cout<<"\nyou picked Medium\n"; break;
        case Hard: cout<<"\nyou picked Hard\n"; break;
        default: cout<<"\nwrong input!!!\n"; break;
        }
        return 0;
     }
2
Aman Singh
  • 注:これがこの特定の質問に答えないことは知っています。しかし、それは人々が検索エンジンを介してアクセスする質問です。そのため、これらのユーザーに役立つと信じてここに投稿しています。

フレンドであっても、別の関数からクラス全体の列挙型にアクセスしている場合は、クラス名に値を指定する必要があることに注意してください。

class PlayingCard
{
private:
  enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
  int rank;
  Suit suit;
  friend std::ostream& operator<< (std::ostream& os, const PlayingCard &pc);
};

std::ostream& operator<< (std::ostream& os, const PlayingCard &pc)
{
  // output the rank ...

  switch(pc.suit)
  {
    case PlayingCard::HEARTS:
      os << 'h';
      break;
    case PlayingCard::DIAMONDS:
      os << 'd';
      break;
    case PlayingCard::CLUBS:
      os << 'c';
      break;
    case PlayingCard::SPADES:
      os << 's';
      break;
  }
  return os;
}

PlayingCard::HEARTSHEARTSだけではありません。

2
v010dya
#include <iostream>
using namespace std;

int main() {

    enum level {EASY = 1, NORMAL, HARD};

    // Present menu
    int choice;
    cout << "Choose your level:\n\n";
    cout << "1 - Easy.\n";
    cout << "2 - Normal.\n";
    cout << "3 - Hard.\n\n";
    cout << "Choice --> ";
    cin >> choice;
    cout << endl;

    switch (choice) {
    case EASY:
        cout << "You chose Easy.\n";
        break;
    case NORMAL:
        cout << "You chose Normal.\n";
        break;
    case HARD:
        cout << "You chose Hard.\n";
        break;
    default:
        cout << "Invalid choice.\n";
    }

    return 0;
}
0
bornhusker

ユーザーの入力は常に文字列の形式で提供されます...ユーザーの入力を文字列から整数に変換する場合は、そのためのコードを提供する必要があります。ユーザーが数字(たとえば、「1」)を入力した場合、文字列をatoi()に渡して、文字列に対応する整数を取得できます。ユーザーが英語の文字列(例: "EASY")を入力した場合、その文字列をチェックし(例:strcmp()を使用)、一致するチェックに基づいて適切な整数値を変数に割り当てる必要があります。ユーザーの入力文字列から派生した整数値を取得したら、通常どおりswitch()ステートメントに渡すことができます。

0
Jeremy Friesner