当前位置: 首页 > news >正文

MFC CObject的使用

目录

  • 1 从 CObject 派生类
    • 1.1 使用基本 CObject 功能
    • 1.2 添加运行时类信息
    • 1.3 添加动态创建支持
    • 1.4 添加序列化支持
  • 2 访问运行时类信息
  • 3 动态对象创建

1 从 CObject 派生类

  • 在 CObject 的讨论中,经常使用术语“接口文件”和“实现文件”。 接口文件(通常称为头文件,或 .H 文件)包含类声明和使用该类所需的任何其他信息。 实现文件(或 .CPP 文件)包含类定义以及实现类成员函数的代码
  • 从 CObject 派生类时,可以从四个级别的功能中进行选择:
    1)基本功能:不支持运行时类信息或序列化,但包括诊断内存管理
    2)基本功能加上对运行时类信息的支持
    3)基本功能加上对运行时类信息和动态创建的支持
    4)基本功能加上对运行时类信息、动态创建和序列化的支持
  • 为重用而设计的类(以后将用作基类的类)至少应包括运行时类支持和序列化支持(如果预期将来有任何序列化需求)
  • 通过在从 CObject 派生的类的声明和实现中使用特定的声明和实现宏来选择功能级别

1.1 使用基本 CObject 功能

	//.h文件的声明class CSimple : public CObject{// add CSimple-specific members and functions...};

1.2 添加运行时类信息

  • 头文件.h文件的声明
    //.h文件的声明
    class CPerson : public CObject
    {DECLARE_DYNAMIC(CPerson)// other declarations
    };
    
  • 在类的实现文件 (.CPP) 中使用IMPLEMENT_DYNAMIC 宏
    //此宏采用类的名称及其基类作为参数
    IMPLEMENT_DYNAMIC(CPerson, CObject)
    
  • 始终将 IMPLEMENT_DYNAMIC 放在类的实现文件 (.CPP) 中。 IMPLEMENT_DYNAMIC 宏应在编译期间只计算一次,因此不应在接口文件 (.H),该接口文件可能包含在多个文件中

1.3 添加动态创建支持

  1. CObject 类派生你的类
  2. 在类声明中使用 DECLARE_DYNCREATE 宏
  3. 定义没有参数的构造函数(默认构造函数)
  4. 在类实现文件中添加 IMPLEMENT_DYNCREATE 宏

1.4 添加序列化支持

  1. CObject 类派生你的类
  2. 重写 Serialize 成员函数
    如果直接调用 Serialize,即不希望通过多态指针序列化对象,请省略步骤 3 到 5
  3. 在类声明中使用 DECLARE_SERIAL 宏
  4. 定义没有参数的构造函数(默认构造函数)
  5. 在实现文件中使用 IMPLEMENT_SERIAL 宏
  • “多态指针”指向类的对象(将其称为 A)或从 A 派生任何类的对象(例如 B)。 若要通过多态指针进行序列化,框架必须确定它正在序列化 (B) 的对象运行时类,因为它可能是从某些基类 (A) 派生的任何类的对象

2 访问运行时类信息

  • 如果已从 CObject 派生类并使用了从 CObject 派生类一文中介绍的 DECLARE_DYNAMICIMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE、或 DECLARE_SERIALIMPLEMENT_SERIAL 宏,则 CObject 类能够在运行时确定对象的具体类
  • 使用 RUNTIME_CLASS 宏
CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
  • 使用 IsKindOf 函数: 可用于确定某个特定对象是否属于某个指定类或者是否派生自某个特定类,且确保类具有运行时类支持
class CPerson : public CObject
{DECLARE_DYNAMIC(CPerson)// other declarations
};

3 动态对象创建

  • 在给定运行时类的情况下动态创建对象
CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CMyClass);
CObject* pObject = pRuntimeClass->CreateObject();
ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CMyClass)));
  • 在需要序列化或动态可创建性等功能时,可以从 CObject 派生一个类。 许多数据类需要序列化到文件中,因此,通常最好从 CObject 派生
  • 从 CObject 类派生的开销是最小的。 派生的类仅继承四个虚函数和一个 CRuntimeClass 对象

相关文章:

MFC CObject的使用

目录1 从 CObject 派生类1.1 使用基本 CObject 功能1.2 添加运行时类信息1.3 添加动态创建支持1.4 添加序列化支持2 访问运行时类信息3 动态对象创建1 从 CObject 派生类 在 CObject 的讨论中,经常使用术语“接口文件”和“实现文件”。 接口文件(通常称…...

CNI 网络流量分析(六)Calico 介绍与原理(一)

文章目录CNI 网络流量分析(六)Calico 介绍与原理(一)介绍安装Calico-node初始化Calico-node 服务Felixconfdallocate-tunnel-addrsmonitor-addressesmonitor-tokenstatus-reporterbirdcalico-kube-controllersCNI 网络流量分析&am…...

机器视觉_HALCON_示例实践_1.检测圆形

文章目录一、引言二、检测圆形三、总结一、引言 前面的文(用户指南/快速向导)差不多已经把HALCON的基本内容讲完了,并且在学习过程中还跑过一个简单示例——在单一背景下定位回形针。示例跑过,顿时觉得自己行了,但如果…...

使用yolov5训练数据集笔记

准备工作 1. 安装labelimg labelimg:主要用于目标检测的目标框绘制,得到关于我们训练的边框位置、类别等数据 pip install labelimg2. 下载yolov5源码 我使用的是v7.0版本,直接下载即可,下载后解压出来 2.1 安装yolov5运行依赖包 进入…...

常用类详解(三)StringBuilder

(1)一个可爱的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全的),该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类&#x…...

OpenCV 文字绘制----cv::putText详解

opencv中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数——在图像上绘制文字。这个函数cv::putText()。 具体形式如下: void cv::putText( cv::Mat& img, // 待绘制的图像 const string& text, // 待绘制的文字 cv::Point origin…...

同IP多个端口域名同时进行目录爆破

背景 目录爆破是信息收集不可缺的一部分 在渗透过程中,扫描地址时发现同IP下存在多个端口,且每个端口均属于域名,仅仅端口号不同 需求 同一个IP下,同时收集多个不同端口的域名目录爆破进行信息收集,且简单便捷(一行代码) 用到的工具 gobuster 下载地址:https://…...

react+antd+Table里切换Switch改变状态onChange 传参

场景&#xff1a;table列表里面&#xff0c;操作用Switch切换状态。对应列改变操作在colums里面// 表格行const colums: ColumnsType<potentialType> [{title: useLocale(创建时间),dataIndex: creation_date,key: creation_date,align: center,render: (v: string, rec…...

《底层逻辑:看清这个世界的底牌》读后感

书名《底层逻辑&#xff1a;看清这个世界的底牌》作者刘润简介如果只教给你各行各业的“干货”&#xff08;方法论&#xff09;&#xff0c;那只是“授人以鱼”&#xff0c;一旦环境出现任何变化&#xff0c;“干货”就不再适用。但如果教给你的是底层逻辑&#xff0c;那就是“…...

【2023】Prometheus-Blackbox_exporter使用

目录1.下载及安装blackbox_exporter2.修改配置文件设置监控内容2.1.使用http方式作为探测3.与prometheus集成4.导入blackbox仪表盘进行观测1.下载及安装blackbox_exporter 下载安装包 wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.23.0/black…...

嵌入式Linux学习经典书籍-学完你就是高手

很多刚入门的朋友一直都有人问我要学习资料&#xff0c;嵌入式实在太杂&#xff0c;网上很多人写的太不负责了&#xff0c;本书单综合了本人以及一些朋友多年的经验整理而成。 本人见识和阅读量有限&#xff0c;本书单可能有不对的地方&#xff0c;欢迎朋友指正&#xff0c;交…...

网络基础-基础网络命令

文章目录路由命令查询添加路由1.添加访问某台主机的静态路由2.添加访问某个网络的静态路由3.添加默认网关&#xff1a;删除设计关键字路由2参考路由 命令查询 通过 route --help 或man route 查询 添加路由 1.添加访问某台主机的静态路由 route add -host [目标主机IP地址…...

域对象共享数据

处理请求的过程&#xff1a;获取请求参数&#xff0c;调用service处理业务逻辑&#xff0c;往域对象中共享数据&#xff0c;最后实现渲染页面跳转。请求域中共享数据ModelAndView向request域对象共享数据ModelAndView&#xff1a;往域对象共享数据&#xff0c;并实现页面跳转和…...

【基于jeeSite框架】SpringBoot+poi+Layui自定义列表导出

文章目录功能效果思路代码前台后台easyPoi,easyExcel&#xff0c;poi三者的区别poipoi依赖导出ExcelHSSF方式导出XSSF方式导出SXSSF方式导出导入excelHSSF方式导入XSSF方式导入SXSSF方式导入easyPoi依赖包采用注解导出导入easyExcel依赖采用注解导出导入API文档easyPoi操作文档…...

使用 RGB 值设置颜色

使用 RGB 值设置颜色 另一种可以在 CSS 中表示颜色的方法是使用 RGB 值。 RGB 即红色、绿色、蓝色&#xff08;英语&#xff1a;Red, Green, Blue&#xff09;。 ● 红色&#xff08;R&#xff09;0 到 255 间的整数&#xff0c;代表颜色中的红色成分。。 ● 绿色&#xff08;G…...

【python学习笔记】:5个高效编程技巧

01 交换变量​​​​​​​ >>>a3 >>>b6 这个情况如果要交换变量在c中&#xff0c;肯定需要一个空变量。但是python不需要&#xff0c;只需一行&#xff0c;大家看清楚了​​​​​​​ >>>a,bb,a >>>print(a)>>>6 >>&g…...

IP多播技术详解

文章目录前言IP多播技术的相关基本概念IP多播地址和多播组在局域网上进行硬件多播IP多播地址和多播MAC地址映射关系在因特网上进行IP多播网际组管理协议IGMP多播路由选择协议前言 随着计算机网络的发展和个人计算机的普及&#xff0c;人们能够方便的在网络上畅游&#xff0c;进…...

华为OD机试真题Python实现【数组排序】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出解题思路核心知识点Python 代码实现代码运行结果版权说明</...

丹麦市政当局通过 NetIQ 身份和访问管理解决方案,提高安全合规性

丹麦市政当局通过 NetIQ 身份和访问管理解决方案&#xff0c;提高安全合规性 概览 公司&#xff1a;普华永道 行业&#xff1a;咨询 地点&#xff1a;丹麦 挑战 创建一个通用框架&#xff0c;以便丹麦市政当局可以无需内部专业知识的前提下利用高级身份和访问管理 使用的…...

内网渗透学习官方文档

内网渗透0x00 kerberos协议0x01 ntlm协议0x02 管道0x03 smb协议0x04 windows访问控制0x05 令牌窃取0x06 SPN扫描&kerberoast0x07 黄金票据0x08 白银票据0x09 MS140680x10 NTDS.DIT && sam0x11 NTLM Relay0x12 MS08-0680x13 CVE-2019-13840x00 kerberos协议 kerber…...

6ES5943-7UB21西门子中央处理器模块

型号全称&#xff1a;西门子 SIMATIC S5-115U CPU 943B 中央处理器模块订货号&#xff1a;6ES5943-7UB21一、产品特性属于SIMATIC S5-115U系列中型 PLC 中央处理单元型号为CPU 943B&#xff0c;自带48KB RAM工作内存配备2 路 TTY 通信接口&#xff0c;支持编程器 / 上位机连接带…...

Z-Image Atelier 生成极限测试:挑战高分辨率与复杂构图下的稳定性

Z-Image Atelier 生成极限测试&#xff1a;挑战高分辨率与复杂构图下的稳定性 最近在玩各种AI绘画工具&#xff0c;发现一个挺有意思的现象&#xff1a;很多模型生成小图看着还行&#xff0c;一旦把分辨率往上提&#xff0c;或者画面内容变得复杂&#xff0c;就容易“翻车”。…...

进程与线程:操作系统中的“公司”与“员工”

进程与线程&#xff1a;操作系统中的“公司”与“员工”在操作系统的宏大叙事中&#xff0c;进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是两个最基础也最容易混淆的概念。很多初学者容易将它们混为一谈&#xff0c;认为它们只是“大任务”和“小…...

LSM9DS1驱动开发指南:Arduino库深度解析与STM32移植

1. Arduino_LSM9DS1 库深度解析&#xff1a;面向嵌入式工程师的 LSM9DS1 IMU 驱动开发指南LSM9DS1 是意法半导体&#xff08;STMicroelectronics&#xff09;推出的高集成度 9 轴惯性测量单元&#xff08;IMU&#xff09;&#xff0c;内部集成了三轴加速度计、三轴陀螺仪和三轴…...

OWL ADVENTURE优化升级:让你的视觉探索更流畅高效

OWL ADVENTURE优化升级&#xff1a;让你的视觉探索更流畅高效 1. 全新升级亮点概览 OWL ADVENTURE最新版本带来了多项性能优化和功能增强&#xff0c;让视觉探索体验更加流畅高效。这次升级不仅提升了核心AI引擎的处理能力&#xff0c;还对用户界面进行了多项改进&#xff0c…...

3D Face HRN生产环境部署:支持Nginx反向代理+HTTPS外网安全访问

3D Face HRN生产环境部署&#xff1a;支持Nginx反向代理HTTPS外网安全访问 你想把那个酷炫的3D人脸重建模型放到公网上&#xff0c;让团队成员或客户也能用上吗&#xff1f;直接暴露Gradio的端口&#xff0c;不仅不安全&#xff0c;还可能因为网络问题访问不了。 今天&#x…...

18-AI论文创作:自动找参考文献并精准标注

示例 薛磊.组织学习、数字能力与组织敏捷性的关系研究[D].吉林大学,2024. https://link.cnki.net/doi/10.27162/d.cnki.gjlin.2024.001308 关键词&#xff1a; 数字技术 组织学习 AI实战 使用大模型“探索” 请找到这这段话的内容向匹配的参考文献&#xff0c;并以&#xff…...

L298N电机驱动模块避坑指南:从选型到实战(附Arduino代码)

L298N电机驱动模块避坑指南&#xff1a;从选型到实战&#xff08;附Arduino代码&#xff09; 当你第一次拿到L298N模块时&#xff0c;可能会被它简单的蓝色PCB板迷惑——这个看似普通的模块&#xff0c;实际上藏着不少"坑"。作为创客项目中最常用的电机驱动方案之一&…...

突破性数据增强:如何用Time-Series-Library解决时间序列稀疏性难题

突破性数据增强&#xff1a;如何用Time-Series-Library解决时间序列稀疏性难题 【免费下载链接】Time-Series-Library A Library for Advanced Deep Time Series Models. 项目地址: https://gitcode.com/GitHub_Trending/ti/Time-Series-Library 在时间序列分析领域&…...

图解Uboot FIT Image:its文件里的load、entry地址到底怎么填?(以i.MX8MP为例)

深入解析Uboot FIT Image&#xff1a;i.MX8MP平台its文件地址配置实战指南 当你在i.MX8MP平台上第一次看到FIT Image的its文件时&#xff0c;那些神秘的load和entry地址值是否让你感到困惑&#xff1f;这些看似随意的十六进制数字背后&#xff0c;其实隐藏着嵌入式系统启动过程…...