通过字符串实例化对象

58 篇文章 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();
}

就是这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值