2012-02-13 3 views
1

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

Некоторые псевдо-код:

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, если это имеет значение вообще.

ответ

0

Что вы, возможно, хотите, это factory pattern. В принципе, вы будете делать что-то вроде этого:

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 видно.

Edit: Лично мне нравится выше стиль, но более компактная версия

foo* foo::Create(int num) 
{ 
    if (num==0) return new fan(); 
    if (num==1) return new fawn(); 
    ... 
} 
+0

Хорошо, хорошо, я обдумывал это довольно долгое время, и даже самые умные решения требуют всего, что печатает. Это раздражает, но я отмечу это как ответ через несколько минут. Спасибо. – Kaslai

+0

@Aslai Просто хочу убедиться, что вы видите мое редактирование. Это не * что * плохо ... –

+0

@Aslai В любом случае, рад помочь. –

0

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

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