参考:http://developer.51cto.com/art/201002/182994.htm
本文的实现基于上述博客中的代码修改而来。
本文实现的反射机制,其实就是根据字符串,构造一个类对象
ClassInfo是记录类名与其相应的工厂函数
DynBase是实现反射机制的公共基类,每个继承它的子类需要在构造函数中传递其类名的字符串给DynBase的构造函数
template<class T> class DynBase;
template<class T>
class ClassInfo
{
public:
typedef DynBase<T>* (*funCreateObject)();
std::string Type;
funCreateObject Fun;
ClassInfo(std::string type, funCreateObject fun)
{
Type = type;
Fun = fun;
}
};
template<class T>
class DynBase
{
public:
DynBase(std::string type);
virtual ~DynBase(){};
static bool Register(std::string type);
static DynBase* CreateObject(std::string type);
static DynBase* CreateObject();
private:
static std::map<std::string, ClassInfo<T>*> m_classInfoMap;
};
调用的时候如下
class CIndustry : public DynBase<CIndustry>
{
public:
CIndustry();
virtual ~CIndustry();
void print();
};
CIndustry* pCIndustry = dynamic_cast<CIndustry*>(DynBase<CIndustry>::CreateObject("CIndustry"));
总结:
本文中采用模板的实现方式,与参考文章中的实现方式相比,优点是在使用过程中子类不需要含有其它多余的成员,只需在构造函数处传递类名字符串;缺点是会生成比较多的代码,有没有更好的方法呢?如果你看到这里,请不吝赐教!!
全部的源码可在这里下载http://download.csdn.net/detail/kkxsj/7374213
下面几个网页也很不错