首先是要寫一個類,這個類主要有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(類索引)