听说是入门级别的反射。因为一开始不知道要创建哪个类的对象,直到确定名字才创建,所以我到处找资料看,GET的新技能
加入一个类,把他注册进去。呃 别人这么讲的,感觉就是字符串和类一一对应起来。
由map<string,VOIDFUNC>来存储一个函数,这个函数创建对象。typedef void* (*VOIDFUNC)();
Factory类 管理map
Regclass类 只有一个构造函数,负责注册类
T*的函数 返回new T()呐 就是他 实例化对象
这个宏 就构造了一个函数 还绑定给了map
#define REGCLAS(classname)\
classname* objcreator##classname(){\
return new classname(); }; \
RegClass reg(#classname, (VOIDFUNC)objcreator##classname)
using namespace std;
typedef void* (*VOIDFUNC)();
class Factory
{
private:
Factory(){}
map<string, VOIDFUNC>mp;
public:
void* getObjByName(string str)
{
map<string, VOIDFUNC>::const_iterator iter;
iter = mp.find(str);
if (iter != mp.end())return iter->second;
else return nullptr;
}
void Reg(const string &str, VOIDFUNC func)
{
mp.insert(make_pair(str, func));
}
static Factory &getInstance()
{
static Factory f;
return f;
}
};
class RegClass
{
public:
RegClass(string str, VOIDFUNC func){
Factory::getInstance().Reg(str, func);
};
};
实验例子
class B{
public:void p()
{
printf("ggggggggg");
}
};
REGCLAS(B);
int main()
{
B*b = (B*)Factory::getInstance().getObjByName("B");
b->p();
cin.get();
}
就是这样。