您的位置:首页 > 其它

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

2015-07-04 14:28 393 查看
什么叫动态创建???

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

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的静态变量,在运行时类信息时(上一篇中),pfnNew为NULL;

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

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

调用CRuntimeClass::CreateObject()函数

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

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

思考&提升:

①这种方式颠覆了我们传统的实例化对象的方式

②有了动态创建,底层代码可以创建上层类(用户定义的类)的对象,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: