Что вы, вероятно, хотите, это фабричный шаблон .По сути, вы сделаете что-то вроде этого:
class foo
{
...
static foo* Create(int num);
}
foo* foo::Create(int num)
{
foo* instance;
switch (num)
{
case 0:
instance = new fan();
break;
case 1:
instance = new fawn();
break;
...
}
return instance;
}
Невозможно избавиться от перечисления, но, по крайней мере, таким образом вам придется создать его ровно один раз, а затем вы сможете его использоватьвезде foo
видно.
Редактировать: Лично мне нравится вышеуказанный стиль, но более компактная версия -
foo* foo::Create(int num)
{
if (num==0) return new fan();
if (num==1) return new fawn();
...
}