c++でenumを宣言する際に以下の様な宣言を見たことはないですか?
1 2 3 4 5 6 |
// どこかのheaderファイル enum struct HogeEnum { FAILURE, SUCCESS, }; |
※structはclassにもなり得る
このstructとかclassって何なんだろう?と言う疑問があり調べてみました。
struct(class)の二つの意味
結論、二つの意味がありそうでした。
・異なるenum値で同じ列挙子を用いる事を可能にする
・int値との違いを明確なものにする
少し解説
※参考
プログラミング言語C++第4版
以下の様なコードはコンパイルは通るでしょうか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Test.h enum Color { RED, BLUE, PURPLE, }; enum TrafficLight { RED, YELLOG, GREEN }; // Test.cpp Color c_red = Color::RED; TrafficLight t_red = TrafficLight::RED; |
まぁ、流れ的に分かりそうですがこれは通りません。
では、どうすれば通るのでしょうか?
同名の列挙子を用いる事を可能にする
以下の様に変更すると通ります。(c++11以降)
1 2 3 4 5 6 7 8 9 10 11 12 |
enum struct Color { RED, BLUE, PURPLE, }; enum struct TrafficLight { RED, YELLOG, GREEN }; |
structを追加しました。
※classでも通ります。
※両方にstructを追加していますが片方だけ追加するだけで通ります。
structを追加したことにより、各列挙子のスコープが明確なものになり、ビルドが通るようになりました。
intとの相互変換
structを加えなければ実はそのまま代入が出来ます。
1 |
int red = Color::RED; |
の具合ですね。
structがある場合は以下の形で相互に変換出来ます。
・int => enum値
1 |
Color enumColorRed = static_cast<Color>(0); |
・enum値 => int
1 |
int intColorRed = static_cast<int>(Color::RED); |
誰かのお役に立てば。
このブログのcocos記事一覧