2

私は列挙型クラスを持っていた、と言う

enum class Enum{
   var1, var2;
}

ここで、パラメータに依存するメンバーを追加したいと思いますvar3(int)。OK、列挙型ではないので、通常のクラスで変更したいのですが、私の目標は、古いコード(Enum::var1タイプの値としてEnum)をコンパイルできるようにすることです。

私はそれをこのようにしようとしました(一時的に忘れvar3ましょう、それは静的関数になります):

class Enum{
    public:
        const static Enum var1 = Enum(1);
        const static Enum var2 = Enum(2);
    private:
        Enum(int v):v(v){
        }
    int v;
    //operator == using v
};

ただし、列挙型の型が不完全なため、コンパイルされません。
ヘッダーにあるため、クラスの後で宣言できません。複数のCPPでは機能しません。その上、ここにパブリックコンストラクターを置くのは良い考えではありません。

何かご意見は?

4

2 に答える 2

1

解決策1:

静的変数の問題の場合:クラス宣言で静的変数を宣言します。

class Enum
{
    public:
        static const Enum var1;
        static const Enum var2;
        Enum(int v):v(v)
        {
        }
    private:
        int v;
        //operator == using v
};

次に、このクラスのソースファイルを作成します。これにEnum.cppは次のものが含まれます。

#include "Enum.h"
const Enum Enum::var1 = Enum(1);
const Enum Enum::var2 = Enum(2);

解決策2:解決策2:

ヘッダーのみにしたい場合は、クラス変数の代わりに静的変数を使用できます。

class Enum
{
    public:
        Enum(int v):v(v)
        {
        }
    private:
        int v;
};

namespace Enumeration // It is not possible to name it 'Enum'
{
    // static => local to translation unit. No linking conflict
    static const Enum var1 = Enum(1);
    static const Enum var2 = Enum(2);
}

ここで実際の例を見ることができます。唯一の欠点は、名前空間にクラスの名前を使用できないことです。

于 2012-11-03T20:24:14.100 に答える
0

次のようなクラスを作成できます。

class Enum
{
public
    enum NestedEnum : int
    {
        var1, var2
    };

    static NestedEnum var3;

    Enum(NestedEnum value) : value(value) { }

    operator NestedEnum() const { return value; }
private:
    NestedEnum value;
};

そして、あなたが宣言できる他のどこでも:

Enum::var3 = (Enum::NestedEnum)someIntegerVariable;
于 2012-11-04T00:19:50.787 に答える