C++ 反射机制的简单实现

C++并不支持反射机制,只能自己实现。

如果需要实现字字符串到函数到映射,一定要使用到函数指针

简单实现反射机制,根据字符串来构造相应到类。主要有以下几点:

(1) 可以使用map保存字符从到函数指针到映射。

(2) 工厂类提供字符串与函数指针到注册关系。

(3) 工厂模式根据不同到字符串构造不同到类对象。

代码示例:

class_factory.h

 1 #ifndef __CLASSFACTORY_
2 #define __CLASSFACTORY_
3
4 #include <iostream>
5 #include<string>
6 #include<map>
7
8 //定义函数指针
9 typedef void* (*create_fun)();
10
11 class ClassFactory{
12 public:
13 ~ClassFactory() {};
14
15 //根据类注册时的名字, 创建类实例, 并返回
16 void* getClassByName(std::string name){
17 std::map<std::string, create_fun>::iterator it = my_map.find(name);
18 if (it == my_map.end()) { return NULL; }
19
20 create_fun fun = it->second;
21 if (!fun) { return NULL; }
22
23 return fun();
24 }
25
26 //注册类名称与指针函数到映射关系
27 void registClass(std::string name, create_fun fun){
28 my_map[name] = fun;
29 }
30
31 //单例模式
32 static ClassFactory& getInstance(){
33 static ClassFactory fac;
34 return fac;
35 }
36
37 private:
38 ClassFactory() {}; //私有
39 std::map<std::string, create_fun> my_map;
40 };
41
42 #endif

test.h

 1 #ifndef __TEST_H
2 #define __TEST_H
3
4 #include <iostream>
5
6 class Test{
7 public:
8 Test(){ std::cout << "call Test Constructor fun" << std::endl; }
9 ~Test(){ std::cout << "call Test Destructor fun" << std::endl; }
10 void print(){ std::cout << "call Test print fun" << std::endl; }
11 };
12
13 void* create_Test(){
14 Test *t = new Test;
15 return (t == NULL)? NULL:t;
16 }
17
18 #endif

main.cpp

 1 #include "test.h"
2 #include "class_factory.h"
3
4 int main(){
5 //注册
6 ClassFactory::getInstance().registClass("Test", create_Test);
7
8 //获取类对象
9 Test *t = (Test*)ClassFactory::getInstance().getClassByName("Test");
10 if (!t){
11 std::cout << "get instnce Test err;" << std::endl;
12 return 1;
13 }
14
15 t->print();
16 delete t;
17 return 0;
18 }

c++反射概念-简单介绍的更多相关文章

  1. Freemarker概念简单介绍

    Freemarker概念简单介绍 1.   Freemarker是什么 模板引擎:一种基于模板的,用来生成输出文本的通过工具. 基于java开发包和类库 2.   Freemarker能做什么 MVC ...

  2. java反射机制简单介绍

    1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...

  3. Java内存模型概念简单介绍,想深入自行百度

  4. java反射机制的简单介绍

    参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...

  5. 简单介绍一下ODI的几个基本概念

    简单介绍一下ODI的几个基本概念   ODI的几个基本概念是本文我们主要要介绍的内容,接下来我们就开始介绍这一过程,一起来看看吧! 什么是资料库 ODI资料库可安装在任何支持ANSIISO89的数据库 ...

  6. LDAP服务器的概念和原理简单介绍

    LDAP服务器的概念和原理简单介绍 1. 目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不 ...

  7. JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇

    原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...

  8. C#反射概念以及实例详解【转】

    2009-08-28 13:12 佚名 互联网 我要评论(1) 字号:T | T C#反射概念以及实例向你介绍了C#反射的基本内容以及C#反射实例的简单应用,希望对你了解和学习C#反射以及C#反射实例 ...

  9. JSP简单介绍

    前言 知识点 1.JSP是什么   java  server   page,javaserver端页面技术.其主要作用在server端动态生成页面, 其组成java代码和html, 2.JSP的组成 ...

随机推荐

  1. python函数基本介绍

    函数 1.函数结构 def 是函数的定义关键字,my_len是函数名.()传参用,冒号下面都是函数体. 执行函数方法:函数名加括号来执行函数.My_len() 举例: # s = 'lkfjsjulk ...

  2. 初识Pentaho(一)

    学习一门语言或工具,首先得知道该工具的用途是什么.Pentaho 的官方定义是一个集数据集成和数据分析于一体的平台.这样的解释还是有点模糊.还是看其有哪些特点吧:  ☐可以进行数据集成.谈到数据集成这 ...

  3. vue的细节

    1.如果使用路由跳转到别的界面的话,例如从文章list页面跳转到具体文章查看详情页,查看某一个具体就需要传递那个文章的id去后台查询, this.$router.push的params方法可以实现传递 ...

  4. 端午节佳节从CSDN博客搬家来这,请多多指教

    端午节佳节从CSDN博客搬家来博客园,请多多指教

  5. CentOS7 搭建GIT环境

    一. 安装 libiconv 这个是非常规项 如果服务器原来已经装过 可以不装 但是如果git安装时候提示找不到libiconv 需要在git的安装参数中指定安装路径 最新版是 1.15 wget h ...

  6. vue分页组件重置到首页问题

    分页组件,可以借用这个老哥的@暴脾气大大https://www.cnblogs.com/sebastian-tyd/p/7853188.html#4163272 但是有一个问题就是下面评论中@ Mrz ...

  7. st link 连接问题ST LINK is not in the DFU mode plesse restart it

    原因:插上st link后做了一些操作才点击升级.如点击了连接stlink,如下图等: 解决办法: 1. 拔掉stlink 2. 插上stlink 3. 不要点其他的,直接点击ST-LINK-> ...

  8. APP如何发布到Google play 商店

    APP如何发布到Google play 商店?以及有哪些需要注意的点 2015-05-13 10:07 19773人阅读 评论(1) 收藏 举报  分类: iPhone游戏开发(330)  链接:ht ...

  9. BZOJ1083_繁忙的都市_KEY

    题目传送门 裸的最小生成树. code: /************************************************************** Problem: 1083 U ...

  10. hdu 2187(凸包直径 1.枚举 2.旋转卡壳)

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33115   Accepted: 10278 ...