是否可以将指向类的指针用作枚举常量?

Is it acceptable to use pointers to class as enum constants?

本文关键字:指针 枚举常量 是否      更新时间:2023-10-16

假设我有一些全局对象:

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

表示MyClass的所有有意义状态

是否有很好的理由不按如下方式由它们组成enum ?

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

这样,在其他代码中,我可以传递枚举,并转换它:(MyClass*) (MyEnum::A)

不行。枚举数只能用常量表达式初始化,你的变量a, b, c肯定不是。

enum值是编译时常量,而new的返回值是运行时值,因此您甚至不能这样做(加上您可能会在转换为int时丢失一些数据)。我认为对于SO来说,进行冗长的讨论是否可能是个好主意是没有意义的。

正如其他人已经说过的,这是不可能的。但是你可以用单例模式实现类似的东西,例如:

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)

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