首先是要写一个类,这个类主要有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(类索引)