宏DECLARE_DYNCREATE与DECLARE_DYNAMIC

2023-12-23 12:08
文章标签 dynamic declare dyncreate

本文主要是介绍宏DECLARE_DYNCREATE与DECLARE_DYNAMIC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、作用

DECLARE_DYNCREATE的主要作用:

  1. 支持对象的动态创建: 使用 DECLARE_DYNCREATE 宏声明的类可以在运行时动态创建对象。

  2. 支持对象的序列化: MFC框架提供了对象的序列化支持,允许将对象的状态保存到磁盘(序列化为文件)或通过网络传输,然后重新加载对象状态

语法如下,在.h文件中声明该宏,必须在对应的cpp文件中使用IMPLEMENT_DYNAMIC宏

DECLARE_DYNCREATE(class_name )

 DECLARE_DYNAMIC:支持运行时类型识别(RTTI)

看源码可知,DECLARE_DYNCREATE包含了DECLARE_DYNAMIC宏,所以凡是支持动态创建的,一定支持RTTI。

二、DECLARE_DYNCREATE实例

class CMyObject : public CObject
{DECLARE_DYNCREATE(CMyObject)public:CMyObject();  // 构造函数// 其他成员函数和属性// 声明对象的序列化函数virtual void Serialize(CArchive& ar);
};

三、DECLARE_DYNAMIC的源码

通过上面的解释:可以认为使用这个DECLARE_DYNCREATE(class_name)可以使每个CObject的对象在运行的时候具备动态创建的能力。MFC框架利用这种能力来创建对象,例如当它从磁盘读取一系列对象的时候,很多对象都需要动态的去创建。

DECLARE_DYNAMIC在afx.h中声明如下:

#define DECLARE_DYNCREATE(class_name) \DECLARE_DYNAMIC(class_name) \static CObject* PASCAL CreateObject();#define DECLARE_DYNAMIC(class_name) \
protected: \static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \static const CRuntimeClass class##class_name; \static CRuntimeClass* PASCAL GetThisClass(); \virtual CRuntimeClass* GetRuntimeClass() const; \ // 获取该类的类型为CRuntTimeClass的成员变量

 可以看出:主要是一个静态成员变量CRuntimeClass,一个虚函数GetRuntimeClass

参考:

https://www.cnblogs.com/htj10/p/11831404.html

DECLARE_DYNCREATE与DECLARE_DYNAMIC区别_51CTO博客_DECLARE_DYNCREATE

DECLARE_DYNCREATE(class_name)的具体作用_不修边幅的胖子的博客-CSDN博客

这篇关于宏DECLARE_DYNCREATE与DECLARE_DYNAMIC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527975

相关文章

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探

【硬刚ES】ES基础(十三)Dynamic Template和Index Template

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

Spark动态资源分配-Dynamic Resource Allocation

关键字:spark、资源分配、dynamic resource allocation Spark中,所谓资源单位一般指的是executors,和Yarn中的Containers一样,在Spark On Yarn模式下,通常使用–num-executors来指定Application使用的executors数量,而–executor-memory和–executor-cores分别用来指定每个ex

强化学习实践(二):Dynamic Programming(Value \ Policy Iteration)

强化学习实践(二):Dynamic Programming(Value \ Policy Iteration) 伪代码Value IterationPolicy IterationTruncated Policy Iteration 代码项目地址 伪代码 具体的理解可以看理论学习篇,以及代码中的注释,以及赵老师原著 Value Iteration Policy Itera

NEUOJ 1117: Ready to declare(单调队列)

1117: Ready to declare 时间限制: 1 Sec   内存限制: 128 MB 提交: 358   解决: 41 [ 提交][ 状态][ 讨论版] 题目描述 Finally, you find the most good-looking girl... You are going to write a letter to her. But you a

【Kubernetes】持久卷的动态供给 Dynamic Provisioning

《持久化存储》系列,共包含以下文章: K8s 持久化存储方式持久卷 PV持久卷声明 PVC持久卷的动态供给 Dynamic Provisioning 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!! 持久卷的动态供给 Dynamic Pr

Design Pattern—— Dynamic Proxy Pattern(三) 动态代理模式

done by myself 通过下面例子,进一步演示 动态代理 的强大特性,将会体会到 相对于静态static代理,动态可实现 一个proxy代理不同的真实对象。灵活多变。只需要在Client类 调整要代理的角色,无需改动其他部分。使代理角色、真实角色的对应关系更松散了。 抽象角色: package com.proxy.severalCase;public interfa

DECLARE_GLOBAL_DATA_PTR、gd_t、bd_t及uboot中 start_armboot 代码分析

一、Uboot中DECLARE_GLOBAL_DATA_PTR 只是一个定义的宏,这个宏定义了一个gd_t全局数据结构的指针,这个指针存放在指定的寄存器中(386体系结构没有放到指定寄存器中)。这个宏定义在\include\asm-arm\globe_data.h文件中 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *g

步态识别论文Dynamic Aggregated Network for Gait Recognition(1)

摘要:步态识别在视频监控、犯罪现场侦查、社会安全等领域有着广泛的应用前景。然而,在实际场景中,步态识别往往受到多种外部因素的影响,如携带条件、穿着外套、视角多样等。近年来,各种基于深度学习的步态识别方法取得了可喜的成果,但它们倾向于使用固定权重的卷积网络提取显著特征之一,没有很好地考虑关键区域中步态特征之间的关系,忽略了完整运动模式的聚合。 在本文中,我们提出了一个新的观点,即实际的步态特征包括

C.Interface.And.Implementations—dynamic arrays的实现

1、An  array  is a homogeneous sequence of values in which the elements in the sequence are associated one-to-one with indices in a contiguous range.  2、Arrays in some form appear as built-in data typ