C++也要玩反射

news/2024/5/19 5:20:35 标签: c++, 反射, c++反射

C艹也要玩反射

  • 什么是反射
  • 为什么不直接用map
  • 实现原理
  • 代码示例
    • 产品子类
    • 构造器
    • 工厂
    • 客户端使用
      • 启动时注册
      • 运行时使用

什么是反射

  反射,简单说,就是给定一个字符串(或其他标识),能够成功找到一个对象实例。以上一篇工厂模式的内容为例,程序中读到一个字符串“/index.html”,就能够拿到IndexCallResponse类的一个实例。

为什么不直接用map

  通过一个标识,找到一个对象,大多数人第一想法是用map不就行吗?用map的确可以,但是有一定的局限性,使用map,需要在程序启动的时候就创建好这个map,无法动态使用。比如,大多数子类对象可能会长时间没人使用,为了节省机器资源,不想他启动就创建,等有人使用的时候再创建。或者,这个类不是单例的,想每次用的时候都创建一次,这种场景map很难实现。

实现原理

  实现上也要借助于map,但是map中不直接存放类的实例对象,而是存放一个函数指针,该指针指向一个用来创建子类实例的函数。一个子类对应一个创建函数,代码中子类的数量一定是一个确定的固定值,那么其对应的创建函数也一定是一个固定值。在程序启动时,使用标识和创建函数的函数指针构建map,当需要某个子类的对象时,使用标识去map中找到对应的函数指针,通过函数指针调用创建函数,在创建函数中创建子类实例。

代码示例

产品子类

class IndexCallResponse : public WebPageCallResponse
{
   
public:
	static WebPageCallResponse *create();
	void service(HttpPacketRequest* request, HttpPacketResponse* respons);
};

WebPageCallResponse* IndexCallResponse::create()
{
   
	return new IndexCallResponse;
}

class FaviconCallResponse : public WebP

http://www.niftyadmin.cn/n/5233073.html

相关文章

01_学习使用javax_ws_rs_上传文件

文章目录 1 前言2 Maven 依赖3 上传接口4 如何解析 MultipartFormDataInput5 结语 1 前言 使用 Spring MVC 来处理文件上传,想必是大家耳熟能详的了,如下代码: ResponseBody PostMapping("/upload") public String upload(Request…

前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由、组件库

文章目录 AjaxAjax特点 Promise 异步编程(缺)Promise基本使用状态 - PromiseState结果 - PromiseResult AxiosVue中使用AxiosAxios请求方式getpostput和patchdelete并发请求 Vue路由 - vue-router单页面Web应用(single page web application&…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载:https://download.vulnhub.com/cereal/Cereal.ova 靶场难度:困难 发布日期:2021年5月29日 文件大小:1.1 GB 靶场作者:Thomas…

Linux随记(七)

一、欧拉bclinux 21.10安装zabbix-5.0.37.tar.gz (zbx-客户端) #系统环境: BigCloud Enterprise Linux For Euler 21.10 LTS #软件信息: zabbix-5.0.37.tar.gz , pcre-devel-8.44-2.oe1.x86_64.rpm , inst…

Git常用命令#更改用户名

1.查看当前用户信息 git config user.name2.更改用户名 特定仓库中更改用户名 如果你只想在特定仓库中更改用户名,可以在不使用 --global 参数的情况下执行相同的命令,并进入特定仓库的目录进行修改。 cd /path/to/your/repository git config user.na…

在IDEA中,如何修改Jetty的端口号,操作超简单

在IDEA中的jetty配置中的VM options中填入:-Djetty.portxxxx 如下图:

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…

Windows11系统下MemoryCompression导致内存占用率过高

. # &#x1f4d1;前言 本文主要是win11系统下CPU占用率过高如何下降的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…