按编号确定对象类型

时间:2012-02-13 01:15:11

标签: c++ inheritance

我有一个包含许多派生类型的类,并且我有一个与每个派生类关联的唯一编号。是否有一种简单的方法可以将数字与派生类型匹配?

一些伪代码:

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 :(得分: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

编辑:我个人喜欢上面的风格但是更紧凑的版本是

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

答案 1 :(得分:0)

您可以为派生类型的唯一标识符创建枚举。

然后,您可以在派生类中包含一个包含此枚举的字段,您可以在各自的构造函数中设置该字段。这样你就可以只用一个函数来检索它的类型。