通过数字确定对象类型

Determine object type by number

本文关键字:对象 类型 数字      更新时间:2023-10-16

我有一个具有许多派生类型的类,每个派生类都有一个唯一的编号。有没有一种简单的方法可以将数字与派生类型相匹配?

一些伪代码:

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,如果这很重要的话。

您可能想要的是工厂模式。基本上,你会做这样的东西:

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();
   ...
}

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

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