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