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的组成 ...
随机推荐
- 如何在 EXCEL 2003 插入的方框内打对勾,复选框
一个方框里带勾的符号是吧第一种:EXCEL里有个插入符号的功能知道吧,打开它在符号那栏(不是特殊符号那栏),下拉字体找到Wingdings字体,在下面的符号中就能找到框中带勾的符号 第二种:在界面点& ...
- Oracle之单表查询及常用函数
1.语法: select 字段列表 from 表名 [where 查询条件] [group by 分组] [having 分组条件] [order by 排序] select * 代表查询所有的字段 ...
- java 代码块的执行顺序
举一个实例程序: class HelloA { public HelloA(){ System.out.println("Hello A!父类构造方法"); } { System. ...
- shell之lvm
#!/bin/bash #this script for LVM echo "Initial a disk..." echo -e "\033[31mWarning: ...
- 成都Uber优步司机奖励政策(3月30日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 5 多进程copy文件
1.如何进行开发? 2.版本1:程序大框架 #1.创建一个文件夹 #2.获取old文件夹中所有的文件名字 #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 3.版本2:创建一个文件夹 1 ...
- VINS(二)Feature Detection and Tracking
系统入口是feature_tracker_node.cpp文件中的main函数 1. 首先创建feature_tracker节点,从配置文件中读取信息(parameters.cpp),包括: ROS中 ...
- SpringBoot-03:SpringBoot+Idea热部署
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 所谓热部署,就是在项目启动中,修改class类中做的修改操作,无需重新启动项目,就可以变更,在网页展示中有 ...
- vue中开发webSocket
先安装 sockjs-client 和 stompjs npm install sockjs-client npm install stompjs <template> <div&g ...
- SpringMVC+mybatis+maven+Ehcache缓存实现
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文 ...