将ID号映射到类
Mapping an ID number to a class
我正在设置一个系统,在这个系统中,我可以根据从文件中读取的一些信息动态地实例化类。这必须在运行时完成。所讨论的类是多态的,并且都继承自CBaseTheoryEnt
类。我想做的是将ID号与每个类关联起来(例如,与无序映射关联)。实际上,我的管理类将查看从输入文件中读取的一系列ID号,然后实例化相应的类。将类与ID关联,然后根据输入实例化它们的理想且有效的方法是什么?
这样做的一种方法是使用模板函数实例化CBaseTheoryEnt
的子类:
template<typename T>
CBaseTheoryEnt* instantiator() {
return new T;
}
然后为每个从CBaseTheoryEnt
派生的类设置一个hash_map
或这些函数的数组,并将该类的键与该类的实例化器相关联。当对数组或映射进行索引时,将得到一个函数,当调用该函数时,该函数将返回一个指向相应类实例的指针。
例如,如果你有类A, B和C,并且A的id为0,B为1,C为2,那么你有:
typedef CBaseTheoryEnt* (*instantiator_ptr)();
instantiator_ptr classes[] = {
&instantiator<A>,
&instantiator<B>,
&instantiator<C>
};
然后像
一样使用int idx = get_class_id();
CBaseTheoryEnt* inst = classes[idx]();
你没有给出太多的细节,所以这里有一个相当通用的方法,使用map
可能适用:
struct Base
{
virtual int ID() const = 0;
// ...
};
typedef Base * (*create_fp)();
typedef std::map<int, create_fp> create_map;
class DerivedA : public Base { /* ... */ };
class DerivedB : public Base { /* ... */ };
class DerivedC : public Base { /* ... */ };
namespace BaseCreators
{
DerivedA * makeA() { /* ... */ }
DerivedB * makeA() { /* ... */ }
DerivedC * makeA() { /* ... */ }
}
const create_map creators {
{ 1, BaseCreators::makeA },
{ 2, BaseCreators::makeB },
{ 3, BaseCreators::makeC }
};
int main()
{
int a = get_id_from_user();
create_fp cr = creators.find(a)->second; // or check for existence first
Base * b = cr();
}
(如果您没有c++ 11,您将不得不使creators
映射为非常量并手动填充它)
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 从函数角度看ID到文件路径的内部与外部映射
- 如何创建<id,成员函数>的映射?
- 如何将字符串(ID)映射到新的子类对象C 的创建
- 我想使用C++映射,以存储一个矩形id的4个坐标,任何人都可以举一个例子吗
- 特定于线程的数据 - 为什么我不能只使用带有线程 ID 的静态映射?
- 如何将MFC对话框映射到不同的帮助id
- 如何在MFC中映射错误消息框的帮助id
- 将ID号映射到类
- 使用映射类型会产生GCC错误:预期的未限定id在' for '之前
- c++登录任务计划错误:没有完成帐户名和安全id之间的映射
- 在映射中使用std::thread::id可以确保线程安全
- 使用映射检查id是否存在
- 如何正确地将CMFCMenuButton选定的ID发送到消息映射