博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C++实现简单的反射机制
阅读量:2170 次
发布时间:2019-05-01

本文共 2071 字,大约阅读时间需要 6 分钟。

备忘记录下来。

代码是从抠出来的。

引用的另外一篇博客的地址:。但是这篇博客不是最原始地址,原始地址在博客里有描述 “ Published on , by  in ,  ”,不知道URL是什么。

 

代码如下:

宏定义REGISTER解读:这个宏做了两件事情,第一件事情是声明了一个函数,即 className* objectCreator##className();声明的这个函数,每有一个类需要注册,就会配套着有一个new出待注册类的函数。这些个函数有一致的格式:无参数,返回类型为该类的指针(可以强转为void*)。第二件事情是声明了一个对象,即 RegisterAction g_creatorRegister##className(xxx,yyy);这个RegisterAction构造函数有两个参数,第一个参数string是类的名字,第二个参数PTRCreateObject是一个函数指针,指向上面第一步声明的那个函数。在做第二件事情时,也即RegisterAction的构造函数,会将它的两个参数分别当作key和value,插入到ClassFactory::m_classMap当中,这也就是ClassFactory::getInstance().registClass(className, ptrCreateFn);这句代码的真正用途。当然啦,第二件事情声明的这个对象是位于静态存储区的,它会在main函数之前就被构造出来。
#include #include 
#include
using namespace std;typedef void* (*PTRCreateObject)(void);class ClassFactory {private: map
m_classMap; ClassFactory() {}; //构造函数私有化public: void* getClassByName(string className); void registClass(string name, PTRCreateObject method); static ClassFactory& getInstance();};void* ClassFactory::getClassByName(string className) { map
::const_iterator iter; iter = m_classMap.find(className); if (iter == m_classMap.end()) return NULL; else return iter->second();//返回的是PTRCreateObject类型的函数指针,可以转化为void*}void ClassFactory::registClass(string name, PTRCreateObject method) { m_classMap.insert(pair
(name, method));}ClassFactory& ClassFactory::getInstance() { static ClassFactory sLo_factory; return sLo_factory;}class RegisterAction {public: RegisterAction(string className, PTRCreateObject ptrCreateFn) { ClassFactory::getInstance().registClass(className, ptrCreateFn); }};#define REGISTER(className) \ className* objectCreator##className(){ \ return new className; \ } \ RegisterAction g_creatorRegister##className( \ #className,(PTRCreateObject)objectCreator##className)//test classclass TestClass {public: void m_print() { cout << "hello TestClass" << endl; };};REGISTER(TestClass);void test_register_class(){ TestClass* ptrObj = (TestClass*)ClassFactory::getInstance().getClassByName("TestClass"); ptrObj->m_print(); return ;}

 

转载地址:http://sbmzb.baihongyu.com/

你可能感兴趣的文章
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
什么是ActiveRecord
查看>>
有道词典for mac在Mac OS X 10.9不能取词
查看>>
关于“团队建设”的反思
查看>>
利用jekyll在github中搭建博客
查看>>
Windows7中IIS简单安装与配置(详细图解)
查看>>
linux基本命令
查看>>
BlockQueue 生产消费 不需要判断阻塞唤醒条件
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>