C++ 反射的实现

首先是要写一个类,这个类主要有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(类索引) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章