0
点赞
收藏
分享

微信扫一扫

通过字符串实例化对象


听说是入门级别的反射。因为一开始不知道要创建哪个类的对象,直到确定名字才创建,所以我到处找资料看,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();
}


就是这样。

举报

相关推荐

0 条评论