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的组成 ...
随机推荐
- 模拟MBR Grub故障修复
1. MBR故障修复 备份 mkdir /pp mount /dev/sdb1 /pp dd if=/dev/sda of=/pp/mrb.bak bs=512 count=1 破坏mrb dd ...
- HDFS原理
1 . NameNode 概述 a. NameNode 是 HDFS 的核心. b. NameNode 也称为 Master. c. NameNode 仅存储 HDFS 的元数据:文件系统中所有文件的 ...
- Python 爬虫 (二)
cookiejar模块: 管理储存cookie,将传出的http请求添加cookie cookie存储在内存中,CookieJar示例回收后cookie将自动消失 实例:用cookjar访问人人网主页 ...
- 插入排序,C语言实现
插入排序是稳定排序,时间复杂度最低为O(n),最高为O(n^2),平均为O(n^2). 插入排序是将数组分为两部分,一部分已经排好序,另一部分未排好序,每次从未排好序的部分取第一个元素插入到已经排好序 ...
- categorical[np.arange(n), y] = 1 IndexError: index 2 is out of bounds for axis 1 with size 2
我的错误的代码是:train_labels = np_utils.to_categorical(train_labels,num_classes = 3) 错误的原因: IndexError: ind ...
- 从Github开源项目《云阅》所学到的知识
感谢开源,感谢大神,才让我们这些菜鸟成长! 附上云阅开源项目地址:点我吧. 1.轮播图的实现. 现在的APP基本都会实现这个功能吧,然后一直都找不到好的第三方库,能够满足各种需求.然而碰到了这个开源库 ...
- Caliburn.Micro 杰的入门教程3,事件和参数
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- python字符串格式化符号及转移字符含义
博文出自鱼C论坛文章 http://bbs.fishc.com/thread-39140-1-1.html
- SpringBoot学习:获取yml和properties配置文件的内容
项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @Configu ...
- nuget在jenkins上不能自动还原项目依赖包---笔记
最近遇到一个情况,IDE 是 VS2015 Update3 ,新建一个library项目(暂时叫做 mytests),然后用 nuget 安装了一个 Shouldly 包 在 VS 上一切正常,可以跑 ...