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