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
- c 结构体反射机制实现
- 【Object C】 反射机制
- Objective-C反射机制
- 【C#】:浅谈反射机制
- Object-c反射机制
- 【C#】反射机制
- java利用反射实现Object-c中的KVC机制
- 反射机制的实现
- JavaScript 实现反射机制
- iOS实现反射机制
- iOS实现反射机制
- C++实现反射机制
- C++实现反射机制
- C++实现反射机制
- c++实现反射机制
- C++ 实现反射机制
- C++实现反射机制
- C++ 实现反射机制
- 浅谈ViewHolder
- 不懂Git,别说自己是程序猿–20分钟git快速上手
- HDOJ 1176 免费馅饼 (DP)
- 写出高效清晰Layout布局文件的一些技巧
- Scala 模式匹配下的for循环
- c++实现反射机制
- Android自助餐之Jni(四)在线导入so文件
- 关于mapreduce的topN的问题
- 数据库
- leetcode第14题——*Longest Common Prefix
- Android中BroadcastReceiver
- leetcode之Merge Sorted Array
- 对javascript匿名函数的理解(透彻版)
- 带进度条控制的视频读取与存储