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

MFC程序设计(八)动态创建机制

动态创建机制作用

我们之前所学常见的创建类对象有以下两种方法:

A a;//方法一

A* a = new A();//方法二

这两种方法都需要直到类名才可以创建


在不知道类名的情况下,就需要依靠动态创建机制来创建对象了。实际上这有点吹,还是需要知道类名的

在实际中,我们常见的创建对象的方法是我们自己创建的,而通过这种方法创建的对象是让MFC自己创建的

动态创建机制使用

代码验证

#include<afxwin.h>
#include<iostream>
class CAnimal : public CObject//没有动态创建机制,无法利用对象加工厂函数创建对象
{
	DECLARE_DYNAMIC(CAnimal);//运行时类信息机制
};
IMPLEMENT_DYNAMIC(CAnimal, CObject)

class CDog : public CAnimal
{
	DECLARE_DYNCREATE(CDog);//动态创建机制
};
IMPLEMENT_DYNCREATE(CDog, CAnimal)

int main()
{
	CObject* pob = RUNTIME_CLASS(CDog)->CreateObject();//对象加工厂
	if(pob)
	{
		std::cout << pob << std::endl;
	}
	else
	{
		std::cout << "对象创建失败" << std::endl;
	}
	return 0;
}

上述程序运行后,打印类对象地址,说明对象成功创建出来了 

与运行时类信息区别

宏展开

//DECLARE_DYNCREATE(CDog);宏展开
	DECLARE_DYNAMIC(CDog)//此处为运行时类信息机制声明,也是个宏
//DECLARE_DYNAMIC(CDog)宏展开
public: 
	static const CRuntimeClass classCDog; //静态的结构体
	virtual CRuntimeClass* GetRuntimeClass() const; //虚函数

	static CObject* PASCAL CreateObject();//此处并非对象加工厂函数

//IMPLEMENT_DYNCREATE(CDog, CAnimal)宏展开
CObject* PASCAL CDog::CreateObject() 
{ 
    return new CDog; 
}

IMPLEMENT_RUNTIMECLASS(CDog, CAnimal, 0xFFFF, CDog::CreateObject, NULL)//此处也是一个宏
//IMPLEMENT_RUNTIMECLASS(CDog, CAnimal, 0xFFFF, CDog::CreateObject, NULL)宏展开
AFX_COMDAT const CRuntimeClass CDog::classCDog = 
{ 
		"CDog", 
		sizeof(class CDog),
		0xFFFF, 
		CDog::CreateObject,//新增加的静态函数地址
		RUNTIME_CLASS(CAnimal), 
		NULL,
		class_init 
}; 

CRuntimeClass* CDog :: GetRuntimmeClass() const
{
    return RUNTIME_CKASS(CDog)
}

动态创建机制执行过程

RUNTIME_CLASS(CDog)->CreateObject()//函数内部this为本类(CDog)的静态变量地址:链表头节点
{
  CObject* pObject = (*m_pfnCreateObject)() //CDog::CreateObject,第四个成员
  {
    return new CDog; 
  }
  return pObject;
}


http://www.kler.cn/a/532067.html

相关文章:

  • 自定义数据集 使用scikit-learn中SVM的包实现SVM分类
  • 996引擎-怪物:Lua 刷怪+清怪+自动拾取
  • k8s二进制集群之ETCD集群证书生成
  • Linux防火墙基础
  • Kamailio 不通过 dmq 实现注册复制功能
  • 深入解析 posix_spawn():高效的进程创建方式(中英双语)
  • mysql不同种类时间字段的区别
  • Linux ifstat 命令使用详解
  • qt-Quick笔记之Dark Mode And Light Mode In Application
  • 应对现代电子商务的网络威胁—全面安全战略
  • (脚本学习)BUU18 [CISCN2019 华北赛区 Day2 Web1]Hack World1
  • 自制小动画
  • 基于开源2 + 1链动模式AI智能名片S2B2C商城小程序的内容创作与传播效能探究
  • ubuntu 网络管理--wpa_supplicant、udhcpc
  • Block Blaster Online:免费解谜游戏的乐趣
  • 如何不更新application.yml而更新spring的配置
  • 解读“大语言模型(LLM)安全性测评基准”
  • 蓝桥杯备考:高精度算法之乘法
  • Maven 概述与安装配置
  • 网络安全学习 day4
  • 物业管理平台系统促进智能社区管理与服务模式的创新与发展
  • 站在JavaScript的视角去看,HTML的DOM和GLTF的Json数据。
  • < 自用文儿 > 下载 MaxMind GeoIP Databases 对攻击的 IP 做 地理分析
  • 深度学习篇---深度学习框架图像预处理各部分组件
  • Love Tester:探索爱情的深度与维度
  • [特殊字符]const在函数前后的作用详解(附经典案例)