MFC六大机制之五:动态创建机制

什么叫动态创建???

        创建位置类型的对象,我们可以先写一个创建对象的函数,要求是任何类的对象都可以使用该函数去创建,也包括后来定义的类。(你给我哪个类这个函数就能创建这个类的对象,函数在类的定义之前)

   1.建一个win32控制台程序。

   2.将stdafx.h 添加头文件<afxwin.h>。

   3.Project-->Settings菜单项中设置使用MFC库

   4.编写代码:

// DynCreate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

//定义支持动态创建的类
class CAnimal:public CObject
{
	DECLARE_DYNCREATE(CAnimal)
};

IMPLEMENT_DYNCREATE(CAnimal,CObject)

class CDog:public CAnimal
{
	DECLARE_DYNCREATE(CDog)
};
IMPLEMENT_DYNCREATE(CDog,CAnimal)

//创建函数
void CreateMyObject(CRuntimeClass *pClass)
{
	//创建对象
	CObject *pObj = pClass->CreateObject();
	printf("对象地址:%p\n",pObj);
	printf("类的名称:%s\n",pClass->m_lpszClassName);

}


int main(int argc, char* argv[])
{
	CreateMyObject(RUNTIME_CLASS(CAnimal));
	CreateMyObject(RUNTIME_CLASS(CDog));

	return 0;
}


注意:

       1.  派生自CObject

        2.  添加动态创建的声明宏和实现宏

             DECLARE_DYNCREATE(theClass)

             IMPLEMENT_DYNCREATE(theClass,baseClass) 



从语法角度来讲创建对象只有下边两种方式,那么我们上边的实质是哪种呢???

 ① 类名 对象名(参数)  

② 类名 对象名=new 类名(参数)   


下边我们做个宏代换得到:

// DynCreate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//定义支持动态创建的类
class CAnimal:public CObject
{
	DECLARE_DYNCREATE(CAnimal)
};
IMPLEMENT_DYNCREATE(CAnimal,CObject)

class CDog :public CAnimal
{
	//DECLARE_DYNCREATE(CDog)
	DECLARE_DYNAMIC(CDog) 
	static CObject* PASCAL CreateObject();

};
//IMPLEMENT_DYNCREATE(CDog,CAnimal)
CObject* PASCAL CDog::CreateObject() 
{ 
	return new CDog; 
} 
//IMPLEMENT_RUNTIMECLASS(CDog, CAnimal, 0xFFFF, CDog::CreateObject)
AFX_COMDAT const AFX_DATADEF 
CRuntimeClass CDog::classCDog = { 
	"CDog", sizeof(class CDog), 0xFFFF, 
		CDog::CreateObject,//创建对象的函数地址 
		RUNTIME_CLASS(CAnimal), 
		NULL };
CRuntimeClass* CDog::GetRuntimeClass() const 
{ 
	return RUNTIME_CLASS(CDog); 
} 

//创建任意支持动态创建的类的对象
void CreateMyObject(CRuntimeClass *pClass)
{
	//创建对象
	CObject* pObj = pClass->CreateObject();
	printf("对象地址:%p\n",pObj);
	printf("类的名称:%s\n",pClass->m_lpszClassName);
}
int main(int argc, char* argv[])
{
	CreateMyObject(RUNTIME_CLASS(CAnimal));
	CreateMyObject(RUNTIME_CLASS(CDog));
	return 0;
}

分析:

1. CDog有一个静态变量和一个虚函数:

CreateObject()----- 静态函数,创建该类的对象。

    classCDog-----类型是CRuntimeClass的静态变量,在运行时类信息时(上一篇中),pfnNewNULL

                         在动态创建时,它是CreateObject函数的地址。


2. 对象时怎么创建出来的??? 在这行加断点调试CObject* pObj = pClass->CreateObject(); 我们可以看出:

调用CRuntimeClass::CreateObject()函数
    在该函数中,首先判断,m_pfnCreateObject(CRuntimeClass的一个成员变量)是否为空,如果不为空,通过它调用CDog::CreateObject函数,在这个函数中,return new CDog;



通俗的我们所定义的函数将就是根据运行时类信息,找到类的地址,然后new一个相应对象



思考&提升:

①这种方式颠覆了我们传统的实例化对象的方式 
②有了动态创建,底层代码可以创建上层类(用户定义的类)的对象,


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值