30
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【c++】enum struct(class)とは

Last updated at Posted at 2015-03-09

元ブログ

c++でenumを宣言する際に以下の様な宣言を見たことはないですか?

// どこかのheaderファイル
enum struct HogeEnum
{
  FAILURE,
  SUCCESS,
};

※structはclassにもなり得る

このstructとかclassって何なんだろう?と言う疑問があり調べてみました。

struct(class)の二つの意味

結論、二つの意味がありそうでした。

・異なるenum値で同じ列挙子を用いる事を可能にする
・int値との違いを明確なものにする

少し解説

※参考
プログラミング言語C++第4版

以下の様なコードはコンパイルは通るでしょうか?


// Test.h
enum Color
{
    RED,
    BLUE,
    PURPLE,
};
enum TrafficLight
{
    RED,
    YELLOG,
    GREEN
};

// Test.cpp
Color c_red = Color::RED;
TrafficLight t_red = TrafficLight::RED;

まぁ、流れ的に分かりそうですがこれは通りません。

redefinition_enum_red

では、どうすれば通るのでしょうか?

同名の列挙子を用いる事を可能にする

以下の様に変更すると通ります。(c++11以降 [thanks for 7of9さん])


enum struct Color
{
    RED,
    BLUE,
    PURPLE,
};
enum struct TrafficLight
{
    RED,
    YELLOG,
    GREEN
};

structを追加しました。
※classでも通ります。
※両方にstructを追加していますが片方だけ追加するだけで通ります。

structを追加したことにより、各列挙子のスコープが明確なものになり、ビルドが通るようになりました。

intとの相互変換

structを加えなければ実はそのまま代入が出来ます。


int red = Color::RED;

の具合ですね。

structがある場合は以下の形で相互に変換出来ます。

int => enum値

Color enumColorRed = static_cast<Color>(0);

enum値 => int


int intColorRed = static_cast<int>(Color::RED);
30
25
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?