C++實現類似JAVA的反射 .

  一個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;
}

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章