c++实现反射机制

来源:互联网 发布:日语学习软件 编辑:程序博客网 时间:2024/06/05 07:49

头文件如下:

/*反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为反射机制。*/#ifndef _HEADER_H_#define _HEADER_H_#include<iostream>#include<map>//增加散列表查询#include<string>using namespace std;//////////////////////////////////////////////////////////////////////////typedef void* (*CreateFuntion)(void);//定义函数指针CreateFuntion//保存类和对应创建函数之类的映射class ClassFactory{public:/*定义一个静态方法,通过类名查找类*/static void* GetClassByName(std::string name){/*定义一个散列表的迭代器,用于遍历存放类的散列表*/map<string, CreateFuntion>::const_iterator find;/*通过迭代器实例化的对象find定位需要查找的类; 用find()函数查找,返回的是一个指向该元素的迭代器*/find = clsMap().find(name);/*如果返回的迭代器不在散列表里,则返回空,否则返回对应的键值(即类对象)*/if (find == clsMap().end()){return NULL;}else{return find->second();}}/*定义一个类的静态插入方法*/static void RegistClass(string name, CreateFuntion method){/*表示已经插入一个类*/cout << "Regist Class " << name << endl;clsMap().insert(make_pair(name, method));}private:/*创建一个map对象的引用函数,返回一个map对象*/static map<string, CreateFuntion>& clsMap();};map<string, CreateFuntion>& ClassFactory::clsMap(){static map<string, CreateFuntion> *s_clsMap = new map<string, CreateFuntion>();  //只进行一次初始化return *s_clsMap;}class RegistyClass{public:RegistyClass(string name, CreateFuntion method){/*调用工厂类里的插入类方法!*/cout << "RegistyClass Construct!\n";ClassFactory::RegistClass(name, method);}};/*定义模板类*/template<class T, const char name[]>class Register{public:Register(){const RegistyClass tmp = rc;}/*定义一个创建插入类对象的方法*/static void* CreateInstance(){return new T;}public:static const RegistyClass rc;};/*'/'表示换行符,将一段过长的代码分成几段,下一行紧接当前这一行代码的后面##表示强制间断;#表示后面跟着的量转换成字符串*/#define DEFINE_CLASS(class_name) \char NameArray##class_name[] = #class_name; \class class_name :public Register<class_name, NameArray##class_name>#define DEFINE_CLASS_EX(class_name,father_class) \char NameArray##class_name[] = #class_name; \class class_name :public Register<class_name, NameArray##class_name>, public father_class//表示继承//////////////////////////////////////////////////////////////////////////#endif


主文件如下:

#include <string>  #include <map>  #include <iostream>#include "Header.h"//定义并初始化rc静态变量,通过这一步,静态变量初始化特性,实现类和对应的创建函数的自动注册template<class T, const char name[]>const RegistyClass Register<T, name>::rc(name, Register<T, name>::CreateInstance);//测试类DEFINE_CLASS(CG){public:void Display(){cout<<"I am Here\n";}};//另外一个测试注册功能的类char  className[] = "TestClass";class TestClass :public Register<TestClass, className>{public:void test(){cout<<"Test\n";}private:int a;};int main(void){//bug,因为没有执行自动注册,所以tmp为NULL了CG* tmp = (CG*)ClassFactory::GetClassByName("CG");tmp->Display();TestClass *pTmp = (TestClass*)ClassFactory::GetClassByName("TestClass");pTmp->test();system("pause");return 0;}


 

 

0 0
原创粉丝点击