ページ 11

列挙型について

Posted: 2011年11月29日(火) 10:28
by jay
たとえば以下のような列挙型を用意するとします
ついでにCOLOR型の変数colorを宣言します

コード:

enum COLOR{RED, BLUE, GREEN, WHITE};
COLOR color;
そしてcolorに値を入れるとき
color = COLOR.

と入力するとVisualC#2010(XNA使用)なら列挙型COLORのメンバのリストが出てきて、そこから値を選択し以下のように記述できるのですが
color = COLOR.GREEN;

VisualC++2008(DXライブラリ使用)ではそれができません。
同じように
color = COLOR.

と書いてもリストは出てきませんし、
color = COLOR.GREEN;

と記述するとエラーを吐き出します。
C++の場合 . はクラスか構造体か共用体の後ろにしかつけられない(とこの記事を書いている途中に気付いた)のでエラーを吐き出すのは当然ですが。
C++環境でも列挙型または定数をC#と同じようにメンバのリストから選べるようにするにはどうすればいいでしょうか?

クラスに定数を組み込むしかないでしょうか?

Re: 列挙型について

Posted: 2011年11月29日(火) 11:18
by beatle
C++11の新しい列挙型を使えば

コード:

enum class COLOR { RED, BLUE, GREEN, WHITE };
COLOR color;
color = COLOR::RED;
のように書けます。
しかしVisual C++ 2008では使えないかもしれません。

C++03までの機能で同じようなことをやるには、例えばこんな感じになります。

コード:

struct Color {
    typedef enum {
        RED, BLUE, GREEN, WHITE
    } Kind;
};
Color::Kind color;
color = Color::RED;
このやり方だと、残念ながら Color color = Color::RED; のようには書けず、どうしてもKindという
余計な型が登場してしまいますが。

もっと凝りだすとhttp://www.geocities.jp/bleis_tift/cpp/ ... eenum.htmlこんな感じの実装もできるようです。僕はこの実装方法を試したことはありませんが。
今更こんな凝った実装をするより、早くC++11の新しい列挙体を使うようにしたほうが良いとは思います。

Re: 列挙型について

Posted: 2011年11月29日(火) 11:40
by Blue
比較対象をC#にしているのでC++では言語仕様が違うので同じようには記述できません。

C++/CLIではenum class(CLI列挙型)があるので、C#に近い記述ができます。

Re: 列挙型について

Posted: 2011年11月30日(水) 08:05
by jay
思ったより反応が遅くなってしまった…。 申し訳ないです。

今回はbeatleさんが教えてくださったやり方で行くことにしました。

C++11はツールの方がもう少しシッカリ対応してくれるようになってから使うことにします(泣)
僕一人が使ってても、回りがその仕様に対応していない可能性が大きいですので(苦笑)


教えてくださったお二方、どうもありがとうございました。