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 }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软与 Canonical 合作,将 systemd 引入 WSL

微软和 Canonical 联合宣布&#xff0c;systemd 现在可以在 Windows Subsystem for Linux&#xff08;WSL2&#xff09;中运行了&#xff0c;此举可以让用户在 Windows 设备上获得更加全面的 Linux 体验。systemd 的作者 Lennart Poettering 在 7 月份离开红帽并加入了微软&…

vsftpd配置

1.) yum install -y vsftpd 2.) useradd -g ftp -s /sbin/nologin afcupload (默认生成/home/afcupload, 可使用 -d参数自定义主目录生成位置) 3.) passwd afcupload 4.) chgrp -R ftp afcupload 5.) chown -R afcupload:ftp afcupload 6.) chmod -R 700 afcupload 4.) 修…

2017.9.6数学

集合&#xff1a;一个可以代表一类事物或数据的代词。&#xff08;个人定义&#xff09; &#xff08;其内容带有辅助功效【个人记不下来】&#xff09;自然数&#xff1a;所有的非负整数。 有理数&#xff1a;是可以用正数和分数代表的数。实数&#xff1a;包括有理数和无理数…

.NET 反向代理-YARP 根据域名转发

编者&#xff1a;fastgithub 就是基于YARP使用域名做转发逻辑的。 前段时间发布过一个关于 YARP 的简单介绍&#xff0c;感兴趣的小伙伴恭请移步看看 .NET 反向代理-YARP 作为反向代理&#xff0c;必不可少的当然是根据域名代理转发啦&#xff0c;毫无疑问&#xff0c;YARP…

第一个python小游戏

guess int(input("猜一猜宝宝心目中的数字是多少:")) secret 8 while guess !secret:guess int(input("哎呀猜错了,重新猜一猜宝宝心目中的数字是多少:"))if guess secret:print("你真厉害,居然猜对了")print("哼,猜对了也不给你奖励&q…

理论实践:循序渐进理解AWR细致入微分析性能报告

1. AWR 概述 Automatic Workload Repository(AWR) 是10g引入的一个重要组件。在里面存贮着近期一段时间内&#xff08;默认是7天&#xff09;数据库活动状态的详细信息。 AWR 报告是对 AWR 视图进行查询而得到的一份自动生成的报告。可以通过下面的脚本手工得到一份 AWR 报告。…

java 动态代理

动态代理 Proxy动态代理是基于实现接口的,被代理类实现了某个功能接口, 代理类实现invocationHandler 接口重写invoke(Object proxy, Method method , class 代理类) 用Proxy.newProxyInstance(类加载器, 被代理类实现的接口的集合, invocationhandler 的实现类)来创建代理类对…

mysql sql语句书写之面试部分

要求一 :查询时,将用户的手机号码(比如1331234567)显示为133***4567 这是在交流群里看到别人发的一个面试题,我本人非常反感直接在查询时进行处理数据的,查询出来再处理不好吗,但是面试题要求是这样. 这里,简单的写了两个表关联查询,然后把手机号码进行处理显示出来select a.ui…

Linux中写入ISO镜像

1、查看U盘标识 fdisk -l2、写入镜像到U盘 sudo dd if/home/***.iso of/dev/sdb转载于:https://www.cnblogs.com/katzepunk/p/7492813.html

Linux上用户之间对话

Linux上用户之间对话 昨天想在CentOS7上与另外一个用户对话&#xff0c;但把命令忘记了&#xff0c;特此记录下来。 Write命令 write命令是单向发送一条消息给同机器的Linux用户。首先通过who命令查看谁在线。 root tty7 2017-03-15 14:38 (:0) root pts/20 …

Redis --数据类型 [1]

一 string 类型 (最简单常用的类型) string是redis最基本的类型&#xff0c;你可以理解成与Memcached一模一样的类型&#xff0c;一个key对应一个value。二 Hash类型(哈希) Redis hash是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。三 List(列…

KestrelServer详解[3]: 自定义一个迷你版的KestrelServer

和所有的服务器一样&#xff0c;KestrelServer最终需要解决的是网络传输的问题。在《KestrelServer详解[2]: 网络连接是如何创建的&#xff1f;》&#xff0c;我们介绍了KestrelServer如何利用连接接听器的建立网络连接&#xff0c;并再次基础上演示了如何直接利用建立的连接接…

c# 文件下载

这样的下载方式 减少服务器的压力&#xff0c; 还有一种省懒劲的方式&#xff1a;后端在iis上配置一个虚拟目录&#xff0c;然后让前端自己拼url地址下载&#xff0c; 这个东西是给后期其他工作人员埋坑&#xff0c;哈哈。 本帖原文转自与 农码一生转载于:https://www.cnbl…

Redis -- 基础操作 [2]

一 获取redis当前数据库符合条件键名 [keys pattern]二 设置string形式key-value [set key value]三 获取存储在指定 key 中字符串的子字符串 [GETRANGE KEY start end]四 删除指定键值对 [del key]五 为给定key设置过期时间 [Expire KEY SECONDS]注: Expireat KEY TIMESTAMP 同…

Centos7作为VNCserver,本地使用VNCViewer连接

1.概念 VNC是一个远程连接工具 VNC is used to display an X windows session running on another computer. Unlike a remote X connection, the xserver is running on the remote computer, not on your local workstation. Your workstation ( Linux or Windows ) is only …

SQL Server CONVERT() 日期转换为新数据类型的 通用函数

http://www.w3school.com.cn/sql/func_convert.asp转载于:https://www.cnblogs.com/renzhituteng/p/6665569.html

在URL中实现简易的WebAPI验签

本文主要介绍一种与微信公众平台对接方式类似的&#xff0c;为 AspNetCore 提供的一种简易的 WebAPI 签名验证中间件。本文相关源码和案例已开源&#xff0c;地址&#xff1a;https://github.com/sangyuxiaowu/SignAuthorization原理说明简易的 API url 签名验证中间件&#xf…

Redis -- Hash(哈希) [3]

Redis Hash 是一个string类型的field和value的 映射表 &#xff0c;hash特别适合用于存储对象。 注 : Redis 中每个 hash 可以存储 232 - 1 键值对&#xff08;40多亿&#xff09;。 比如这样:注:在此,首先推荐一款redis可视化工具 https://redisdesktop.com/download , 是非常…

HBuilder 打包流程

1.运行HBuilder---百度搜索HBuilder&#xff0c;官网下载安装包&#xff0c;解压&#xff0c;运行HBuilder.exe。注册账号&#xff0c;并登陆 2.新建app---在左边右键&#xff0c;选择新建APP&#xff0c;或者&#xff0c;点击中间的新建app 3.在弹出的窗口&#xff0c;填入应用…