说我有一些全局对象:
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)
答案 0 :(得分:4)
那不行。枚举器只能用常量表达式初始化,而变量a
,b
,c
绝对不是。
答案 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)
我很好:为什么你需要这个实现? 顺便说一下,如果你需要循环的话,我建议你使用带有函数指针的向量/数组。