MFC六大机制之五:动态创建机制
2015-07-04 14:28
393 查看
什么叫动态创建???
创建位置类型的对象,我们可以先写一个创建对象的函数,要求是任何类的对象都可以使用该函数去创建,也包括后来定义的类。(你给我哪个类这个函数就能创建这个类的对象,函数在类的定义之前)
1.建一个win32控制台程序。
2.将stdafx.h 添加头文件<afxwin.h>。
3.Project-->Settings菜单项中设置使用MFC库
4.编写代码:
![](http://img.blog.csdn.net/20150704143033792)
注意:
1. 派生自CObject
2. 添加动态创建的声明宏和实现宏
DECLARE_DYNCREATE(theClass)
IMPLEMENT_DYNCREATE(theClass,baseClass)
从语法角度来讲创建对象只有下边两种方式,那么我们上边的实质是哪种呢???
① 类名 对象名(参数)
② 类名 对象名=new 类名(参数)
下边我们做个宏代换得到:
分析:
1. CDog有一个静态变量和一个虚函数:
CreateObject()-----静态函数,创建该类的对象。
classCDog-----类型是CRuntimeClass的静态变量,在运行时类信息时(上一篇中),pfnNew为NULL;
在动态创建时,它是CreateObject函数的地址。
2. 对象时怎么创建出来的??? 在这行加断点调试CObject* pObj = pClass->CreateObject();
我们可以看出:
调用CRuntimeClass::CreateObject()函数
在该函数中,首先判断,m_pfnCreateObject(CRuntimeClass的一个成员变量)是否为空,如果不为空,通过它调用CDog::CreateObject函数,在这个函数中,return new CDog;
通俗的我们所定义的函数将就是根据运行时类信息,找到类的地址,然后new一个相应对象
思考&提升:
①这种方式颠覆了我们传统的实例化对象的方式
②有了动态创建,底层代码可以创建上层类(用户定义的类)的对象,
创建位置类型的对象,我们可以先写一个创建对象的函数,要求是任何类的对象都可以使用该函数去创建,也包括后来定义的类。(你给我哪个类这个函数就能创建这个类的对象,函数在类的定义之前)
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一个相应对象
思考&提升:
①这种方式颠覆了我们传统的实例化对象的方式
②有了动态创建,底层代码可以创建上层类(用户定义的类)的对象,
相关文章推荐
- Watch OS2.0开发概述
- 使用C++11thread实现的一道面试题(一)
- Leetcode 49 Anagrams
- 【MatLab】将矩阵写入到文件
- [数字dp] hdu 3271 SNIBB
- mysql批量备份 多表
- Leetcode 204 Count Primes
- 关于Runtime.getRuntime().exec 进程会一直被挂起,一直在等待的原因。
- java 泛型
- 【bzoj1001】【狼抓兔子】
- Pascal's Triangle II
- 第二章:创建框架和窗口
- 微信开发 支付开发redirect_uri参数错误解决办法
- 整数类型
- c++ 适配器
- Leetcode 202 Happy Number
- 多线程编程面试题
- java教程网
- Leetcode 217 Contains Duplicate
- Dynamics CRM 2015 Update 1 系列(5): 获取最近更新的数据 - RetrieveEntityRequest