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

发布于:2025-02-10 ⋅ 阅读:(33) ⋅ 点赞:(0)

动态创建机制作用

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

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;
}


网站公告

今日签到

点亮在社区的每一天
去签到