您的位置:首页 > 编程语言 > C语言/C++

C++实现类似JAVA的反射 .

2012-08-21 23:04 567 查看
  一个JAVA程序员都知道,JAVA的反射功能让框架程序可以变得很强大,可以在运行期间根据一个类名,动态地创建该类的一个对象.

  一个C++程序员都知道,C++本身是不具备反射能力的.但是,JAVA的反射说白了,就是对内存的玩弄而已.

  在程序运行前或者在程序运行中(个人认为,JAVA的class.forname()是在程序运行中通过类加载器加载该类的.class,从而得到了该类的实例化函数,进而动态创建该对象)在内存中就存在了该类的类名与创建该类对象函数(应该是该类的一个静态回调函数)的映射,从而可以在程序运行期间,通过回调的方法将对象动态地创建出来.所以要实现C++的反射,要实现以下几点:

      1.设计一个工厂类,该类有一个静态的MAP,用于保存类名与该类实现化对象静态回调函数的映射关系,从而可以通过该工厂类动态创建类对象.

     2.每个要实现反射的类都要有一个静态的实例化该对象的回调函数,且要把这个函数注册到工厂类的MAP中

 只要实现了以上2点,就可以使C++具有反射的功能了.

    以下是我设计的一个C++可以实现反射的类库简单实现:

#ifndef _FS_H

#define _FS_H

#pragma once

#include <string>

#include <map>

#include <iostream>

using namespace std;

typedef void* (*CreateClass)(void);

/*@类工厂,通过一个MAP成员来实现类名与类的实例化对象函数的映射

* @向外部提供一个接口函数,通过类名来创建该类对象

* @MAP是静态的,这样可以在程序运行前就可以存在

*/

class ClassFactory

{

public:

 static void* 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)

 {

  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()

 {

 

 }

 static void* 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 void* 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;

}

 

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息