将指针用作枚举常量是否可以接受?

时间:2013-01-08 09:35:20

标签: c++

说我有一些全局对象:

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 个答案:

答案 0 :(得分:4)

那不行。枚举器只能用常量表达式初始化,而变量abc绝对不是。

答案 1 :(得分:2)

枚举值是编译时常量,其中new的返回值是运行时值,因此你甚至不能这样做(加上你可能会将转换中的一些数据丢失为int)。我认为,如果有可能的话,深入讨论这是否是一个好主意是不合理的。

答案 2 :(得分: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)

答案 3 :(得分:0)

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