java如何实现反射的_C++中如何实现类似JAVA中的反射

JAVA程序员都知道,JAVA支持反射,也就是运行期间动态识别和创建对象的能力。在实际生产中,可以通过配置文件读取一个类名,然后动态产生相应的对象。具有

很大的灵活性和扩展性。

string name = getNameFromFile();

cObject p = class.ForName(name);

其实,本质上反射的实现是对内存的操控而已。C++语言本身虽不支持反射,但是大家知道MFC框架是支持动态创建的,所以模拟MFC中实现动态创建方法。写了一个小的代码,来实现反射。如果有在框架设计中需要反射的,可以借鉴一下。

#include #include #include   using namespace std;   class CObject; /*顶层父类*/ typedef CObject* (*CreateClass)(void);   /*@类工厂,通过一个MAP成员来实现类名与类的实例化对象函数的映射 * @向外部提供一个接口函数,通过类名来创建该类对象 * @MAP是静态的,这样可以在程序运行前就可以存在 */ class ClassFactory { public:  static CObject* GetClassByName(string className) /*遍历工厂类,根据类名返回类对象*/  {   map::const_iterator iter;   iter = m_classMap.find(className);   if(iter==m_classMap.end())    return NULL;   else    return iter->second();  }    static void RegistClass(string name,CreateClass method)  /*向工厂类注册createClass方法*/  {   m_classMap.insert(pair(name,method));  }   private:  static map m_classMap; };   map ClassFactory::m_classMap;   /*@动态创建类,动态创建的类通过包含该类的一个静态对象 *向类工厂里注册自己的创建对象函数 */ class GenDynamic { public:  GenDynamic(string name,CreateClass method)  {   ClassFactory::RegistClass(name,method);  } };   /*@定义宏,类通过包含该宏,实现动态创建*/ #define DECLARE_RUNTIME(class_name)\ string class_name##Name;\ static GenDynamic* class_name##gd   /*@宏实现,类通过实现该宏,实现动态创建*/ #define IMPLEMENT_RUNTIME(class_name)\ GenDynamic* class_name::class_name##gd\ = new GenDynamic(#class_name,class_name::CreateInstance);   /*@顶层父类*/ class CObject { private:  DECLARE_RUNTIME(CObject); public:  CObject()  {    }    virtual ~CObject()  {    }    static CObject* CreateInstance()  {   return new CObject;  }    virtual void display()  {   cout<display();  return; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值