C++动态创建对象应用技术讲解

2023-05-16

Native C++是不支持根据类名的C++动态创建对象,比如从一个文本文件中读取类名然后构造一个对象.主要原因是没有丰富的动态元信息,没有单根类库。然而可以用几种技术进行实现。如果是类似Spring那样的根据配置文件运行时产生实现某个接口的对象,那么在Windows中至少有三种办法:

1. LoadLibrary + GetProcAdress。这个不用多解释,可以把DLL和Proc的名字动态传入。

2. COM,根据动态获得的CLSID调用GetClassObject获得IClassFactory接口,然后CreateInstance。或者直接调用CoCreateInstance/CoCreateInstanceEx动态产生CoClass。

3. MFC dynamic creation。

Native C++不能在运行时编译代码并即时产生对象,所以JIT的动态生成在C++里做不到。在MFC中,可以参考,总结如下:

MFC的C++动态创建对象可能是最容易使用的方案。查了一下MFC中RTCI的实现,总结一下:

DECLARE_ DYNCREATE(class_name)宏展开后是如下形式:

假设class_name是“CMyClass”


 
 
  1. public:  
  2. static CRuntimeClass classCMyClass;  
  3. virtual CRuntimeClass* GetRuntimeClass() const;  
  4. static CObject* CreateObject(); 

这几行会被加入到CMyClass类的声明中。

IMPAEMENT_DYNCREATE(classname,base_classname)宏定义比较复杂,这个宏展开后类似如下的样子:


 
 
  1. AFX_DATADEF CRuntimeClass CMyClass::classCMyClass = {  
  2. "CMyClass",sizeof(CMyClass),0xFFFF,NULL,RUNTIME_CLASS(CObject),NULL};  
  3. static const AFX_CLASSSINIT _init_CMyClass(&CMyClass::classCMyClass);  
  4. CRuntimeClass* CMyClass::GetRuntimeClass() const  
  5. {  
  6. Return & CMyClass::classCMyClass;  
  7. }  
  8. CObject* PASCAL CMyClass::CreateObject()  
  9. {  
  10. return new CMyClass;  

这个宏做了如下3件事情:

1.初始化CRuntimeClass类型的成员变量classCMyClass

2.创建静态AFX_CLASSINIT结构,该结构如下:


 
 
  1. Struct AFX_CLASSINIT  
  2. {AFX_CLASSINIT(CRuntimeClass* pNewClass);}; 

这个步骤地主要作用是把CMyClass::classCMyClass添加到MFC的一个内部链表中去。

3.覆盖GetRuntimeClass(),以返回成员变量classCMyClass的地址。


 
 
  1. RUNTIME_CLASS宏展开后如下:  
  2. (&class_name::class##class_name) 

C++动态创建对象的时候,调用CRuntime::CreateObject()方法。

这个方法实际上会去调用CRuntime中的一个成员指针,这个指针指向的正是CMyClass::CreateObject()方法。

由上可见,RuntimeClass宏可接受字符串作为参数,但是,仍然需要在编译时定义好需要动态创建的对象类型,上文例子中为CMyClass。通过MFC的这个特性,理论上还是可以从配置文件中读取文本,然后按照文本指定的类型C++动态创建对象,但必须要求在编译时就存在这种类型,不能像动态语言那样无限制的扩展。另外CMyClass必须继承自CObject。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++动态创建对象应用技术讲解 的相关文章

  • 城市列表第三方集成

    城市列表首先要导入两个依赖 xff0c 根据信息放入正确的位置 1 在本app的gradle里面 compile 39 com github andyoom citypicker v1 0 4 39 2 在项目的工作空间build grad
  • Srpingboot+Redis redisTemplate 报空指针异常(注入为NULL)

    今天整合Springboot 43 redis做测试的时候发现了 redisTemplate报空指针错误 原因是注入时候redisTemplate就是null 查了一下后面发现是容器没有启动 单纯的测试是无法注入的 要在测试类上加上 spa
  • KDD 2020 推荐系统论文一览

    作者 学派 链接 https zhuanlan zhihu com p 161705748 编辑 深度传送门 KDD是推荐领域一个顶级的国际会议 本次接收的论文按照推荐系统应用场景可以大致划分为 xff1a CTR预估 TopN推荐 对话式
  • android Button按下及抬起监听事件

    首先我们在 布局中 xff0c 写入Button按钮 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 ht
  • JZVIdeoPlayer(节操视频播放)

    比如jiecao的视频播放 依赖一个是视频 xff0c picasso 图片加载框架 compile 39 cn jzvd jiaozivideoplayer 6 0 0 39 compile 39 com squareup picasso
  • Android Apk编译的apk安装失败解决

    一 xff1a 如果直接拷贝到手机进行安装 提示安装失败 xff0c 解决有两种 第一 xff1a 在我们项目中的 gradle properties 文件中加入 xff0c 下面的那句 android injected testOnly
  • Android APP第三方支付流程

    手机APP 支付宝接入 1 开发前准备 xff1a 申请一个通过实名认证的企业支付宝账号 下载SDK开发包 提供APP apk以备审核 xff0c 审核通过后即可进行代码集成 2 流程 流程图 xff1a 流程解释 xff1a app携带支
  • Android介绍如何生成keystore 文件并使用

    cmd下 进入到jdk的bin目录 xff0c 这样的话 xff0c android keystore文件就会生成在这个目录下 签名的时候我们需要这个文件 C Program Files Java jdk1 7 0 01 bin gt ke
  • android代码APK混淆

    实际的产品研发中为了防止自己的劳动成果被别人窃取 xff0c 混淆代码能有效防止apk文件被反编译 xff0c 进而查看源代码 说来惭愧 xff0c 作为互联网创业公司的我们也确实对竞品Apk反编译研究过 xff0c 如果Apk混淆之后确实
  • android资源文件混淆

    前面一篇文章我们说过Apk的混淆 xff0c 除了源代码的混淆 xff0c 还有资源文件的混淆 微信推出的apk资源混淆方案 xff0c 该方案的具体原理课参见 xff1a 安装包立减1M 微信Android资源混淆打包工具 微信资源混淆工
  • WebView使用

    https www cnblogs com xunzhi p 6023190 html span class hljs keyword public span span class hljs class span class hljs ke
  • 最新研究:AI已可诊断50种眼疾,1.2秒内确认神经系统疾病

    本文由人工智能观察编译 译者 xff1a Sandy 近年来 xff0c 人工智能技术与医疗健康领域的融合不断加深 xff0c 且在科技巨头与资本巨头积极布局的努力下 xff0c 智能医疗正在不断取得新的突破 而根据 自然医学 xff08
  • stm32 fsmc 功能讲解

    LCD有如下控制线 xff1a CS xff1a Chip Select 片选 xff0c 低电平有效 RS xff1a Register Select 寄存器选择 WR xff1a Write 写信号 xff0c 低电平有效 RD xff
  • go语言基础之面向接口编程示例

    span class token keyword package span main span class token keyword import span span class token punctuation span span c
  • ZynqMP SOC 启动Linux遇到TF卡只读(RO)报错

    如果TF卡作为root启动Linux遇到如下错误 xff1a mmcblk0 mmc0 13ab SE128 115 GiB ro VFS Cannot open root device 34 mmcblk0p2 34 or unknown
  • mmc0: error -84 whilst initialising SD card

    玩zynqMP的板子上的SOC xff0c TF作为root启动petalinux系统 xff0c 碰到如下报错 xff1a error 84 whilst initialising SD card 查询Kernel代码中的sd c也没有看
  • .gradle文件夹下没有gradle.properties

    前言 可直接跳过此段到解决方法 前两天刚配置好Android的环境 xff0c 创建了一个Google的sample 但是在构建的过程中就出了问题 Unable to resolve dependency for 39 app 64 deb
  • eclipse编写web.xml中出现The word '...' is not correctly spelled

    为什么会这样呢 xff1f 因为eclipse中设置了拼写检查 xff0c 解决方法 window gt preferences gt 输入spelling xff0c 将右面的enable spelling checking复选框中的勾去
  • centos vsftpd安装

    1 安装vsftpd yum install vsftpd service vsftpd restart vi etc vsftpd vsftpd conf 配置见最下文 vi etc vsftpd vsftpd conf chroot l
  • 小米2013校园招聘笔试题

    题目 xff1a 一个数组里 xff0c 除了三个数是唯一出现的 xff0c 其余的都出现偶数个 xff0c 找出这三个数中的任一个 比如数组元素为 1 2 4 5 6 4 2 xff0c 只有1 5 6这三个数字是唯一出现的 xff0c

随机推荐

  • 自制Anki选择题模板(支持桌面版/移动版)

    复习面试知识偶然发现了一个小东西 anki xff0c 感觉挺好用就是模板有点少 xff0c 做选择题比较费劲 xff0c 网上找了几个终究不如我心意 xff0c 于是参考前人源码 xff0c 自己改编了一个看起来还不错的版本 这是很久以前
  • VMware Workstation 安装 CentOS 7 虚拟机

    安装步骤 VMware 创建CentOS虚拟机 Jack魏的博客 CSDN博客 https blog csdn net WeiHao0240 article details 100894672 VMware Workstation Pro
  • 基于 HAProxy + Keepalived 搭建 RabbitMQ 高可用集群

    RabbitMQ 集群 通常情况下 xff0c 在集群中我们把每一个服务称之为一个节点 xff0c 在 RabbitMQ 集群中 xff0c 节点类型可以分为两种 xff1a 内存节点 xff1a 元数据存放于内存中 为了重启后能同步数据
  • [CentOS7] Install RabbitMQ Using PackageCloud Yum Repository

    Set up Yum Repository A quick way to set up the repository is to use a Package Cloud provided script It is not a require
  • go语言基础之map的增删改查

    package main span class token function import span span class token string 34 fmt 34 span func span class token function
  • 安卓getSharedPreferences 与 getPreferences 与getDefaultSharedPreferences的区别

    整理了一下getSharedPreferences 与 getPreferences 与 getDefaultSharedPreferences 的区别 xff0c 有需要的朋友可以参考下 1 SharedPreferences 简介 为了
  • request、response 中文乱码问题与解决方式

    request乱码 浏览器向服务器发送的请求参数中包含中文字符 xff0c 服务器获取到的请求参数的值是乱码 response乱码 服务器向浏览器发送的数据包含中文字符 xff0c 浏览器中显示的是乱码 乱码产生的原因 不管是request
  • 基于@Transactional注解的Spring事务

    64 Transactional注解 64 Transactional 可以作用于接口 接口方法 类以及类方法上 当作用于类上时 xff0c 该类的所有 public 方法将都具有该类型的事务属性 xff0c 同时 xff0c 我们也可以在
  • 解决Win7系统DHCP Client服务已设置为“自动”开机仍然无法启动问题

    前言 问题描述 xff1a 由于使用了管家 360等软件进行过网络优化 xff0c 导致每次开机不能正常获取IP连接网络 xff0c 并且系统服务项DHCP Client已设置为 自动 xff0c 但是开机仍无法正常启动 网上大部分解决方法
  • java -jar命令运行jar包时指定外部依赖jar包

    大家都知道一个java应用项目可以打包成一个jar xff0c 当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口 具体的方法是修改jar包内目录META INF下的MANIFEST MF文件 比如有个叫做
  • IntelliJ idea设置显示错误代码提示

    idea默认关闭自动编译 xff0c 所以一些编译错误只有在编译的时候才会提示 xff0c 例如修改了引用类 按图中设置打开自动编译 xff1a 注意 xff1a idea默认打开省电模式 xff0c 自动编译在省电模式下被禁用 xff0c
  • HTTPS协议及其工作原理

    一 什么是HTTPS HTTP 协议 xff08 HyperText Transfer Protocol xff0c 超文本传输协议 xff09 是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 HTTP协议传输的数据都是未加密的
  • Tomcat配置https方式访问

    1 准备安全证书 获得安全证书有两种方式 xff1a 一种方式是到权威机构申购CA证书 xff0c 还有一种方式是创建自我签名的证书 本文以自签名证书为例 xff0c 使用SUN公司提供的证书制作工具keytool制作自签证书 xff0c
  • Java证书工具keytool用法总结

    Keytool简单介绍 keytool 是个密钥和证书管理工具 它使用户能够管理自己的公钥 私钥对及相关证书 xff0c 用于 xff08 通过数字签名 xff09 自我认证 xff08 用户向别的用户 服务认证自己 xff09 或数据完整
  • TaskSnapShot源码分析

    功能 在android设备上 xff0c 打开最近任务 xff0c 会显示退出app时的界面关机重启后马上打开最近任务 xff0c 还是会显示关机前的app列表 Android为了实现上述的功能 xff0c 在每次app切换时都会对app界
  • go语言基础之结构体赋值

    span class token keyword package span main span class token keyword import span span class token string 34 fmt 34 span s
  • MySQL架构,贴过来,抽空看看

    麻雀虽小 xff0c 五脏俱全 MySQL虽然以简单著称 xff0c 但其内部结构并不简单 本章从MySQL逻辑组成 xff0c 物理组成 xff0c 以及相关工具这几个角度来介绍MySQL的整体架构组成 xff0c 希望能够让读者对MyS
  • 不同人眼里的华为

    经济学人 称它是 xff1a 欧美跨国公司的灾难 xff0c 时代 杂志称它是 xff1a 所有电信产业巨头最危险的竞争对手 xff0c 爱立信全球总裁卫翰思 xff08 Hans Vestberg xff09 说 xff1a 它是我们最尊
  • 一个案例引发的思考

    今天下午 xff0c 团队开了一个简短的版本总结会 会上测试经理分析了一个案例 xff1a 某子程序在转测试后发现不能被平台调度 xff0c 原因是子程序的调度入口跟不符合平台规范 很明显开发在转测试前没有充分自验证 xff0c 测试经理提
  • C++动态创建对象应用技术讲解

    Native C 43 43 是不支持根据类名的C 43 43 动态创建对象 比如从一个文本文件中读取类名然后构造一个对象 主要原因是没有丰富的动态元信息 xff0c 没有单根类库 然而可以用几种技术进行实现 如果是类似Spring那样的根