14

次のようなクラスがあります。

class Car  
{  
public:  
    Car();  
    // Some functions and members and <b>enums</b>  
    enum Color
    {
        Red,
        Blue,
        Black
    };  
    Color getColor();
    void setColor(Color);  
private:  
    Color myColor;
}

したい:

  1. Colorとして値にアクセスしますColor::RedCar::Redクラスに多くの列挙型、サブクラスなどがある場合、使用される コードを理解するのは本当に困難です。
  2. タイプColorを関数の引数または戻り値として 使用する
  3. 変数型を使用Colorするswitch

私は3つの部分的な解決策を知っています:

  1. 埋め込みクラスColorと列挙型を使用する
  2. 埋め込まれた名前空間Colorと列挙型を使用する
  3. 使用するenum class

1 と 2 の解決策は、加入の問題を解決しますが、 やColor::Redのような機能は使用できません。Color getColor()void setColor(Color)

3 ソリューションには問題があります: VS2010 はサポートしていませんenum class。GCC v.4.1.2 もサポートしていません。それ以降のバージョンの gcc については知りません。

はい、クロスプラットフォーム プロジェクトに取り組んでいます。
私はこの解決策を見つけましたが、それは... 重いようです。
誰かがここで私を助けてくれることを願っています:)

4

3 に答える 3

22

現在の C++ (つまり、C++11 以降) では、次のような列挙値にアクセスできます

enum Color { Red };
Color c = Color::Red;
Color d = Red;

さらに進んで、この表記法の使用を強制することができます。

enum class Color { Red };
Color c = Color::Red;
// Color d = Red;   <--  error now

補足として、基になる型を定義するようになりました。これは、以前はハッキーなコードでのみ可能でした (FORCEDWORDまたは誰か?):

enum class Color : char { Red };
于 2012-04-10T15:56:07.033 に答える
7

ネストされたクラス内の列挙型に名前を付けます (例 1 のように):

class Car
{
public:
    struct Color
    {
        enum Type
        {
            Red,
            Blue,
            Black
        };
    };

    Color::Type getColor();
    void setColor(Color::Type);
};
于 2012-04-10T14:49:27.137 に答える
5

このようなことをしたいときは、名前空間と名前空間の外で typedef を使用する傾向があります (ただし、通常は、クラス内ではなくグローバルにこれを行っています)。このようなもの:

namespace colors 
{
    enum Color 
    {
        Red,
        Blue
        ...
    }
}
typedef colors::Color Color;

このように、名前空間を使用して実際の色を取得しますが、Color型自体は引き続きグローバルにアクセスできます。

Color myFav = colors::Red;
于 2012-04-10T14:51:43.677 に答える