0

いくつかのグローバル オブジェクトがあるとします。

MyClass* a = new MyClass()
MyClass* b = new MyClass()
MyClass* c = new MyClass()

のすべての意味のある状態を表すMyClass

次のようにそれらから列挙型を形成しない正当な理由はありますか?

enum MyEnum {
    A = (int) a,
    B = (int) b,
    C = (int) c
}

他のコードでは、列挙型を渡したり、キャストしたりできます。(MyClass*) (MyEnum::A)

4

4 に答える 4

4

それはうまくいきません。列挙子は定数式でのみ初期化できますが、これは間違いなく変数ではありませんabc

于 2013-01-08T09:41:01.980 に答える
2

enum 値はコンパイル時の定数であり、new の戻り値はランタイム値であるため、それを行うことさえできません (さらに、int へのキャストで一部のデータが失われる可能性があります)。SOがそれが可能であるならば、それが良いアイデアであるかどうかについて長い議論をすることは意味がないと思います.

于 2013-01-08T09:41:06.033 に答える
1

他の人がすでに言ったように、これは不可能です。ただし、シングルトン パターンで同様のことを実現できます。たとえば、次のようになります。

class MyClass
{
public:
    enum MyEnum { A, B, C };

    static MyClass* getAInstance()
    {
        static MyClass* a = new MyClass();
        return a;
    }

    static MyClass* getBInstance()
    {
        static MyClass* b = new MyClass();
        return b;
    }

    static MyClass* getCInstance()
    {
        static MyClass* c = new MyClass();
        return c;
    }

    static MyClass* getInstance(MyEnum instance)
    {
        switch(instance)
        {
        case A:
            return getAInstance();
        case B:
            return getBInstance();
        case C:
            return getCInstance();
        }
    }
};

だからあなたの代わりに(MyClass*) (MyEnum::A)書くだろうMyClass::getInstance(MyClass::A).

于 2013-01-08T10:18:13.343 に答える
0

私は興味があります: なぜこの実装が必要なのですか? ところで、ループのために何かが必要な場合は、関数ポインターでベクトル/配列を使用することをお勧めします。

于 2013-01-08T09:43:28.653 に答える