【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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大观之三(创建对象)相关推荐

  1. mfc大观之一(全局对象)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 一直觉得侯捷的<深入浅出mfc>写的挺好的,但是有一点我自己不太喜欢.那就是,每一 ...

  2. mfc大观之五、六(消息机制和消息运行)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 写过windows程序的朋友都知道,win32主要是利用消息进行界面的编写的.那么在mfc中, ...

  3. mfc大观之四(串行保存)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在mfc当中,保存其实是一件很简单的事情.你要做的很简单,第一步就是编写一个serial的虚函 ...

  4. mfc大观之二(类识别)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在mfc中,判断父类和子类是否存在继承关系是通过静态变量来完成的.举个例子来说,所有子类到父类 ...

  5. MFC六大核心机制之三:动态创建

    MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...

  6. (转载)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)

    上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...

  7. VS2013/MFC编程入门之三十四(工具栏:工具栏资源及CToolBar类)

    上一节中讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执 ...

  8. VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

    前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...

  9. MFC和Win32之三___CGdiObject类和windows Gdi对象

    小结: 前面讲到的windows窗口对象,在windows下用句柄来代表之,并且用了一个数据结构WNDCLASS(窗口类)来描述之.同理,windows的Gdi对象也有一些句柄来代表之(比如hPen等 ...

最新文章

  1. [WorldWind学习]17.视域调度(视域体裁剪)
  2. Hadoop平台安全机制Kerberos认证
  3. CTeX详细安装步骤
  4. 并发量与RAID_RAID 技术全解 – RAID0、RAID1、RAID5、RAID10-宿主机磁盘阵列-香港母机...
  5. Linux Capabilities 入门教程--基础实战篇
  6. Select 可编辑 - 完美支持各大主流浏览器
  7. 给 axios 和 redux-axios-middleware 添加finally方法 的使用心得
  8. python 变量
  9. FinTech:一个单体系统足以撑起银行持续交付全球大项目
  10. JasperReport报表设计总结
  11. 计算机类中英附录,欧盟GMP附录11-计算机系统(中英文对照).pdf
  12. STM32F103C8T6 核心板
  13. 日版IPhone5完美上3G
  14. unity渲染篇:画面亮度、饱和度、对比度调整
  15. 亲朋好友都能看懂的区块链
  16. 如何在Android上访问iCloud服务
  17. Ubuntu18.08安装到移动硬盘(UFEI引导)
  18. linux 查找出包含某个字符串的所有文件的方法详解
  19. ios: Undefined symbols
  20. 部署k8s(16):集群调度策略的四种方案

热门文章

  1. 日本新研究:将光伏组件高温高湿试验速度提高70倍
  2. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)
  3. 深入理解JVM--类的执行机制
  4. Eclipse/MyEclipse注释模板和格式化模板的使用
  5. 把杀某程序封装成sh
  6. android系统如何自适应屏幕大小
  7. 在SQL Server中取得操作系统文件的最后修改日期 [Z]
  8. 详解MariaDB数据库的事务
  9. 大数据时代了解一些问题
  10. 007_控制器可扩展性