Определить тип объекта по номеру - PullRequest
1 голос
/ 13 февраля 2012

У меня есть класс со многими производными типами, и у меня есть уникальный номер, связанный с каждым производным классом.Есть ли простой способ сопоставить число с производным типом?

Какой-то псевдокод:

class foo{
public:
    virtual int bar(int) = 0;
}

class fan:foo{
public:
    int bar(int num){ return num * 5; )
}

class fawn:foo{
public:
    int bar(int num){ return num * 9; );
}



int main(){
    vector<foo*> obj;
    for( int i = 0; i < 100; i ++ ){
        int num = rand() % 2;
        if( num == 0 )
            obj.push_back( new fan() );
        if( num == 1 )
            obj.push_back( new fawn() );
    }
}

Это делает то, что я хочу, но у меня гораздо больше, чем два класса, и япланирую добавить еще много.Есть ли способ сделать это менее подробным образом?

Я использую MinGW, если это вообще имеет значение.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

Вы можете создать перечисление для уникальных идентификаторов для ваших производных типов.

Тогда вы можете просто иметь поле в ваших производных классах, содержащее это перечисление, которое вы устанавливаете в их соответствующих конструкторах. Таким образом, вы можете просто иметь одну функцию для извлечения ее типа.

0 голосов
/ 13 февраля 2012

Что вы, вероятно, хотите, это фабричный шаблон .По сути, вы сделаете что-то вроде этого:

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();
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...