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

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

2012-08-01 10:36 555 查看
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;

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