mfc大观之三(创建对象)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
一般来说,用c++创建对象都是用new、或者是临时变量生成的方法来完成的。而在mfc中我们发现,其实不是这样的。不知道大家有没有注意,无论是view类、doc类、frame类,它们的创建都是系统自动创建生成的,中间不需要开发者进行任何的参与。
这就奇怪了,既然不需要开发者的参与,那么这些class又是怎么创建的呢?原因其实还在于static函数。前面两个blog讨论到了static变量,那么创建对象的过程其实也可以包含在static函数中,大家想一下是不是可以通过这种方法来完成。如果还是觉得想不太出来如何实现的话,可以参考一下下面的代码,或许对大家有一些启发。
#include <iostream>
using namespace std;class cobject;struct runclass {char name[64];struct runclass* next;cobject* (*func)();};#define get_class(basic) \basic::get_run_class()#define CREATE_RUNCLASS(basic) \static runclass run_##basic; \static runclass* get_run_class() {return &run_##basic;} \static cobject* create_object() {return new basic();}class cobject{public:CREATE_RUNCLASS(cobject)public:cobject() {cout << "cobject::cobject()" << endl; }virtual ~cobject() {cout << "cobject::~cobject()" << endl;}};runclass cobject::run_cobject = {"cobject", NULL, &cobject::create_object};#define IMPLEMENT_RUN_CLASS(basic, origin) \runclass basic::run_##basic = {#basic, &origin::run_##origin, &basic::create_object}class ctemplate : public cobject {public:ctemplate() {cout << "ctemplate::ctemplate()" << endl;}~ctemplate() {cout << "ctemplate::~ctemplate()" << endl;}CREATE_RUNCLASS(ctemplate)
};IMPLEMENT_RUN_CLASS(ctemplate, cobject);bool
isKindOf(runclass* basic, runclass* origin){if(NULL == basic || NULL == origin)return false;while(basic->next)basic = basic->next;return 0 == strcmp(basic->name, origin->name) ? true :false;
}int
main(int argc, char* argv[]){runclass* p = get_class(ctemplate);cobject* c = (*(p->func))();delete c;cout << isKindOf(get_class(ctemplate), get_class(cobject)) << endl;return 0;
}
mfc大观之三(创建对象)相关推荐
- mfc大观之一(全局对象)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 一直觉得侯捷的<深入浅出mfc>写的挺好的,但是有一点我自己不太喜欢.那就是,每一 ...
- mfc大观之五、六(消息机制和消息运行)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 写过windows程序的朋友都知道,win32主要是利用消息进行界面的编写的.那么在mfc中, ...
- mfc大观之四(串行保存)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在mfc当中,保存其实是一件很简单的事情.你要做的很简单,第一步就是编写一个serial的虚函 ...
- mfc大观之二(类识别)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在mfc中,判断父类和子类是否存在继承关系是通过静态变量来完成的.举个例子来说,所有子类到父类 ...
- MFC六大核心机制之三:动态创建
MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...
- (转载)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)
上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...
- VS2013/MFC编程入门之三十四(工具栏:工具栏资源及CToolBar类)
上一节中讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执 ...
- VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)
前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...
- MFC和Win32之三___CGdiObject类和windows Gdi对象
小结: 前面讲到的windows窗口对象,在windows下用句柄来代表之,并且用了一个数据结构WNDCLASS(窗口类)来描述之.同理,windows的Gdi对象也有一些句柄来代表之(比如hPen等 ...
最新文章
- [WorldWind学习]17.视域调度(视域体裁剪)
- Hadoop平台安全机制Kerberos认证
- CTeX详细安装步骤
- 并发量与RAID_RAID 技术全解 – RAID0、RAID1、RAID5、RAID10-宿主机磁盘阵列-香港母机...
- Linux Capabilities 入门教程--基础实战篇
- Select 可编辑 - 完美支持各大主流浏览器
- 给 axios 和 redux-axios-middleware 添加finally方法 的使用心得
- python 变量
- FinTech:一个单体系统足以撑起银行持续交付全球大项目
- JasperReport报表设计总结
- 计算机类中英附录,欧盟GMP附录11-计算机系统(中英文对照).pdf
- STM32F103C8T6 核心板
- 日版IPhone5完美上3G
- unity渲染篇:画面亮度、饱和度、对比度调整
- 亲朋好友都能看懂的区块链
- 如何在Android上访问iCloud服务
- Ubuntu18.08安装到移动硬盘(UFEI引导)
- linux 查找出包含某个字符串的所有文件的方法详解
- ios: Undefined symbols
- 部署k8s(16):集群调度策略的四种方案