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

IMPLEMENT_DYNCREATE的分析

一、介绍

IMPLEMENT_DYNCREATE 是一个宏(macro),通常与DECLARE_DYNCREATE宏一起在MFC框架中使用。它的作用是为一个派生自 CObject 的MFC类提供运行时类型信息(RTTI)和对象的动态创建支持。

具体来说,IMPLEMENT_DYNCREATEC 宏为类提供了以下功能:

  1. 运行时类型信息(RTTI): 它允许在运行时确定对象的实际类型,这对于对象的类型检查和转换非常有用。你可以使用 RUNTIME_CLASS 宏来获取对象的类信息。

  2. 对象的动态创建: 类可以通过类名字符串在运行时动态创建对象。这对于动态加载类并创建对象的场景非常有用,例如在插件系统中。

二、实例

// 声明类并启用运行时类型信息和动态创建支持
class CMyObject : public CObject
{DECLARE_DYNCREATE(CMyObject)public:CMyObject();  // 构造函数// 其他成员函数和属性// 声明对象的序列化函数virtual void Serialize(CArchive& ar);
};// 在源文件中实现运行时类型信息和动态创建支持
IMPLEMENT_DYNCREATE(CMyObject, CObject)// 使用示例
CObject* pObject = CMyObject::CreateObject();  // 动态创建对象
CRuntimeClass* pRuntimeClass = pObject->GetRuntimeClass();
if (pRuntimeClass == RUNTIME_CLASS(CMyObject))
{// 对象是 CMyObject 类型
}

三、源码

IMPLEMENT_DYNCREATE在afx.h中定义如下:

#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \CObject* PASCAL class_name::CreateObject() \{ return new class_name; } \IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \class_name::CreateObject, NULL)#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \CRuntimeClass* PASCAL class_name::_GetBaseClass() \{ return RUNTIME_CLASS(base_class_name); } \AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \#class_name, sizeof(class class_name), wSchema, pfnNew, \&class_name::_GetBaseClass, NULL, class_init }; \CRuntimeClass* PASCAL class_name::GetThisClass() \{ return _RUNTIME_CLASS(class_name); } \//重写GetRuntimeClass虚函数,这个函数最初的定义在CObject中,重写后,将返回子类自己的GetRuntimeClass变量CRuntimeClass* class_name::GetRuntimeClass() const \{ return _RUNTIME_CLASS(class_name); }// 获取类的名称
#define _RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

可以看出:主要是一个GetRuntimeClass函数,用于获取当前类的信息

参考:

DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏_implement_dynamicc_CT8100的博客-CSDN博客

http://www.lryc.cn/news/150110.html

相关文章:

  • Java实现根据短连接获取1688商品详情数据,1688淘口令接口,1688API接口封装方法
  • ABAP FICO 凭证替代 凭证校验
  • 项目验收有哪些流程?
  • C++,类的继承
  • 作业33333333
  • Spring Cloud--从零开始搭建微服务基础环境【二】
  • 算法工程题(中序遍历)
  • jsch网页版ssh
  • 教程i.MX8MPlus开发板SPI转CAN操作
  • Docker中容器的随机命名方式
  • 大数据Flink实时计算技术
  • 数学中的自由与我们的生活
  • 8 python的迭代器和生成器
  • Git的基本使用笔记——狂神说
  • 【小程序】外部二维码扫码打开微信小程序并跳转到指定页面
  • bazel安装
  • Typescript的class语法[类]的操作和应用
  • OPENCV实现暴力特征匹配
  • 揭秘亚马逊Amazon测评,掌握细节和技巧,提升产品销量和评论数量
  • Linux线程互斥
  • 【仿写spring之ioc篇】三、检查是否实现了Aware接口并且执行对应的方法
  • C++ 异常处理
  • OJ练习第157题——单词拆分
  • 若依tab-content面板失效、使用load的解决方法(附详细步骤)
  • 2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)
  • Hadoop 3.2.4 集群搭建详细图文教程
  • STL的学习之一
  • 如何使用Python进行数据科学实验?
  • 华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)