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

那是行不通的。枚举数只能用常量表达式来初始化,而你的变量,a绝对不是。bc

于 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

我很好奇:为什么你需要这个实现?顺便说一句,如果你需要一些 for 循环,我建议你使用带有函数指针的向量/数组。

于 2013-01-08T09:43:28.653 回答