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. 如何在 EXCEL 2003 插入的方框内打对勾,复选框

    一个方框里带勾的符号是吧第一种:EXCEL里有个插入符号的功能知道吧,打开它在符号那栏(不是特殊符号那栏),下拉字体找到Wingdings字体,在下面的符号中就能找到框中带勾的符号 第二种:在界面点& ...

  2. Oracle之单表查询及常用函数

    1.语法: select 字段列表 from 表名 [where 查询条件] [group by 分组] [having 分组条件] [order by 排序] select * 代表查询所有的字段 ...

  3. java 代码块的执行顺序

    举一个实例程序: class HelloA { public HelloA(){ System.out.println("Hello A!父类构造方法"); } { System. ...

  4. shell之lvm

    #!/bin/bash #this script for LVM echo "Initial a disk..."  echo -e "\033[31mWarning: ...

  5. 成都Uber优步司机奖励政策(3月30日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. 5 多进程copy文件

    1.如何进行开发? 2.版本1:程序大框架 #1.创建一个文件夹 #2.获取old文件夹中所有的文件名字 #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 3.版本2:创建一个文件夹 1 ...

  7. VINS(二)Feature Detection and Tracking

    系统入口是feature_tracker_node.cpp文件中的main函数 1. 首先创建feature_tracker节点,从配置文件中读取信息(parameters.cpp),包括: ROS中 ...

  8. SpringBoot-03:SpringBoot+Idea热部署

      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 所谓热部署,就是在项目启动中,修改class类中做的修改操作,无需重新启动项目,就可以变更,在网页展示中有 ...

  9. vue中开发webSocket

    先安装 sockjs-client 和 stompjs npm install sockjs-client npm install stompjs <template> <div&g ...

  10. SpringMVC+mybatis+maven+Ehcache缓存实现

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文 ...