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

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

很大的灵活性和扩展性。

  string name = getNameFromFile();

cObject p = class.ForName(name);


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

#include <string>
#include <map>
#include <iostream>
 
using namespace std;
 
class CObject; /*顶层父类*/


typedef CObject* (*CreateClass)(void);
 
/*@类工厂,通过一个MAP成员来实现类名与类的实例化对象函数的映射
* @向外部提供一个接口函数,通过类名来创建该类对象
* @MAP是静态的,这样可以在程序运行前就可以存在
*/
class ClassFactory
{
public:
 static CObject* GetClassByName(string className) /*遍历工厂类,根据类名返回类对象*/
 {
  map<string,CreateClass>::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<string,CreateClass>(name,method));
 }
 
private:
 static map<string,CreateClass> m_classMap;
};
 
map<string,CreateClass> 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<<"CObject display()"<<endl;
 }
};
IMPLEMENT_RUNTIME(CObject)
 
/*@一个子类*/
class Csun:public CObject
{
private:
 DECLARE_RUNTIME(Csun);
public:
 Csun()
 {
 
 }
 static CObject* CreateInstance()
 {
  return new Csun;
 }
 virtual void display()
 {
  cout<<"Csun display()"<<endl;
 }
};
IMPLEMENT_RUNTIME(Csun)
#endif
 
 
 
以下是测试程序:
 
#include "H1.h"
 
void main()
{
 CObject* p = (CObject*)ClassFactory::GetClassByName("Csun");
 p->display();
 return;
}

你可能感兴趣的:(C++,框架,String,iterator,Class,扩展)