将ID号映射到类

MGZ*_*ero 5 c++ class

我正在建立一个系统,我可以根据从文件中读取的一些信息动态实例化类.所以,这必须在运行时完成.有问题的类是多态的,都是从CBaseTheoryEnt类中继承的.我想要做的是将ID号与每个类相关联(例如,使用无序映射).本质上,我的管理类将查看从输入文件中读入的一系列这些ID号,然后实例化相应的类.将类与ID相关联然后根据输入实例化它们的理想和有效方法是什么?

Set*_*gie 7

一种方法是使用模板函数来实例化以下的子类CBaseTheoryEnt:

template<typename T>
CBaseTheoryEnt* instantiator() {
    return new T;
}
Run Code Online (Sandbox Code Playgroud)

然后hash_map为每个派生一个类的函数或数组,CBaseTheoryEnt并使该类的密钥与它的实例化器相关联.然后,当您索引数组或映射时,您将获得一个函数,该函数在调用时将返回指向相应类的实例的指针.

例如,如果您有A,B和C类,并且A的ID为0,则B为1,C为2,您将拥有:

typedef CBaseTheoryEnt* (*instantiator_ptr)();
instantiator_ptr classes[] = {
    &instantiator<A>,
    &instantiator<B>,
    &instantiator<C>
};
Run Code Online (Sandbox Code Playgroud)

然后就像使用它一样

int idx = get_class_id();

CBaseTheoryEnt* inst = classes[idx]();
Run Code Online (Sandbox Code Playgroud)