官方定义
反射是程序可以访问、检测和修改它本身状态或行为的一种能力。
C++本身并不支持反射机制,可手动通过Map实现。
实际需求
通过类名字符串如“ClassA”生成对应的类对象,并获取类中声明的成员变量和方法,Unreal中蓝图访问C++中类方法即是使用了C++反射机制。
实现思路
为需要反射的类创建类对象的回调函数,在Map中以类名字符串为Key,类对象回调函数为Value,实现绑定。
具体实现
//定义一个函数指针类型,用于指向创建类实例的回调函数
typedef void* (*PTRCreateObject)(void);
//工厂类的定义
class ClassFactory{
private:
map<string, PTRCreateObject> m_classMap ;
ClassFactory(){}; //构造函数私有化
public:
void* getClassByName(string className);
void registClass(string name, PTRCreateObject method) ;
static ClassFactory& getInstance() ;
};
//工厂类的实现
//@brief:获取工厂类的单个实例对象
ClassFactory& ClassFactory::getInstance(){
static ClassFactory sLo_factory;
return sLo_factory ;
}
//@brief:通过类名称字符串获取类的实例
void* ClassFactory::getClassByName(string className){
map<string, PTRCreateObject>::const_iterator iter;
iter = m_classMap.find(className) ;
if ( iter == m_classMap.end() )
return NULL ;
else
return iter->second() ;
}
//@brief:将给定的类名称字符串和对应的创建类对象的函数保存到map中
void ClassFactory::registClass(string name, PTRCreateObject method){
m_classMap.insert(pair<string, PTRCreateObject>(name, method)) ;
}
未完待续...