首先是要写一个类,这个类主要有2个功能,注册类和通过类名获取类实例的功能
typedef map<string, void *> class_map; typedef void* (*CreateObject)(void); //声明 class ClassFactory { public: void Register(const string &name, CreateObject method); void *GetClassByName(const string &name); private: class_map m_ClassMap; } //定义 void* ClassFactory::GetClassByName(const string &name) { class_map::iterator it; it = m_ClassMap.find(name); if (it == m_ClassMap.end()) { return NULL; } else { return it->second; } } void ClassFactory::Register(const string &name, CreateObject method) { m_ClassMap.insert(make_pair(name,method())); }然后需要提供每个类注册到class factory的宏定义
class RegisterFunction { public: RegisterFunction(const string &name, CreateObject method) { ClassFactory::Instance().Register(name, method); } }; #define CLASSCREATOBJECT(classname) \ void *Create##classname(){ \ return reinpreter_cast<void *>(new classname) ; \ } #define REGISTERCLASS(classname) \ RegisterFunction Register##classaname(#classname,(CreateObject) Create##classname)最后在定义类的时候加上
CLASSCREATOBJECT(类名) //这个宏定义定义了一个create 类指针的方法 REGISTERCLASS(类名); // 根据上述的create类指针方法,将类对象register 到class factory中最后的最后在使用的时候只需要,
GetClassByName(类索引)