c++反射概念-简单介绍
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++反射概念-简单介绍的更多相关文章
- Freemarker概念简单介绍
Freemarker概念简单介绍 1. Freemarker是什么 模板引擎:一种基于模板的,用来生成输出文本的通过工具. 基于java开发包和类库 2. Freemarker能做什么 MVC ...
- java反射机制简单介绍
1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...
- Java内存模型概念简单介绍,想深入自行百度
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- 简单介绍一下ODI的几个基本概念
简单介绍一下ODI的几个基本概念 ODI的几个基本概念是本文我们主要要介绍的内容,接下来我们就开始介绍这一过程,一起来看看吧! 什么是资料库 ODI资料库可安装在任何支持ANSIISO89的数据库 ...
- LDAP服务器的概念和原理简单介绍
LDAP服务器的概念和原理简单介绍 1. 目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不 ...
- JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇
原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...
- C#反射概念以及实例详解【转】
2009-08-28 13:12 佚名 互联网 我要评论(1) 字号:T | T C#反射概念以及实例向你介绍了C#反射的基本内容以及C#反射实例的简单应用,希望对你了解和学习C#反射以及C#反射实例 ...
- JSP简单介绍
前言 知识点 1.JSP是什么 java server page,javaserver端页面技术.其主要作用在server端动态生成页面, 其组成java代码和html, 2.JSP的组成 ...
随机推荐
- mysql如何配置sql记录
原文链接:http://www.qqdeveloper.com/detail/11/1.html 为什么要记录sql记录 主要目的是为了检测我们的网站安全问题,有效的避免一些sql注入或者是xss攻击 ...
- python生成器函数中return的作用
当生成器函数中含有return时,return不会返回任何值,会直接终止当前生成器,对yield的作用没有影响,当函数执行到return时候,调用next()来执行生成器则会报错,如果使用for循环遍 ...
- C#/STM32 WAV转byte WAV数据格式
最近在做STM32音乐播放器,选取了最容易做的WAV格式. 为了更方便开发自己做了一个WAV转Byte的小上位机 附软件下载链接 链接:https://pan.baidu.com/s/1Zz7bczZ ...
- 链表--数据结构与算法JavaScript描述(6)
链表 概念 链表是由一组节点组成的集合. 每个节点都使用一个对象的引用指向它的后继. 指向另一个节点的引用叫做 链. 许多链表的实现都在链表最前面有一个特殊节点,叫做头节点. 链表的尾元素指向一个nu ...
- 北京Uber优步司机奖励政策(10月19日~10月25日)
用户组:优步北京人民优步A组(适用于10月19日-10月25日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万 ...
- 基于Kafka的服务端用户行为日志采集
本文来自网易云社区 作者:李勇 背景 随着互联网的不断发展,用户所产生的行为数据被越来越多的网站重视,那么什么是用户行为呢?所谓的用户行为主要由五种元素组成:时间.地点.人物.行为.行为对应的内容.为 ...
- Ruby 基础教程1-5
1.条件语句 if unless case unless和if相反,条件不成立则执行 2.条件 除了 false和nil 其他都是true 3.unless 语法 ...
- iOS 测试工具reveal可视化调试工具的使用
简单翻译一下reveal可视化图形工具插入项目的官方文档(官方英文版file:///Applications/Reveal.app/Contents/SharedSupport/Documentati ...
- Ubuntu安装netdata监控平台
介绍 Netdata通过可扩展的Web仪表板提供准确的性能监控,可以显示Linux系统上的流程和服务.它监控有关CPU,内存,磁盘,网络,进程等指标. Netdata官网地址:https://my-n ...
- Git与远程仓库关联以及关联错误解决方法
假设你github的用户名是 helloworld ,你在上面创建了一个 名为 hello 的 repository. 一. 与本地仓库进行关联 1.1用原生ssh进行关联,速度快: git re ...