MFC对象的创建顺序

MFC中所有的对象以CObject为根,CObject派生出一些类:CCmdTarget、CWnd、CDocument。具体的层次关系如下:

图(1)MFC的层次关系

本案例以MFC程序代码为蓝本,采用Win32 Console Application程序(即控制台应用程序),来仿真MFC的内部行为,当然省略了消息映射和消息循环。

新建一个Console工程,名称为Frame1,详细代码如下:

//mfc.h

#include <iostream.h>

class CObject
{
public:
	CObject::CObject(){cout<<"CObject Constructor \n";}
	CObject::~CObject(){cout<<"CObject Destructor \n";}

};

class CCmdTarget:public CObject
{
public:
	CCmdTarget::CCmdTarget(){cout<<"CCmdTarget Constructor \n";}
	CCmdTarget::~CCmdTarget(){cout<<"CCmdTarget Destructor \n";}
};

class CWinThread:public CCmdTarget
{
public:
	CWinThread::CWinThread(){cout<<"CWinThread Constructor \n";}
	CWinThread::~CWinThread(){cout<<"CWinThread Destructor \n";}
};

class CWinApp:public CWinThread
{
public:
	CWinApp* m_pCurrentWinApp;
public:
	CWinApp::CWinApp(){
		m_pCurrentWinApp=this;
		cout<<"CWinApp Constructor \n";
	}
	CWinApp::~CWinApp(){cout<<"CWinApp Destructor \n";}
};

class CDocument:public CCmdTarget
{
public:
	CDocument::CDocument(){cout<<"CDocument Constructor \n";}
	CDocument::~CDocument(){cout<<"CDocument Destructor \n";}
};

class CWnd:public CCmdTarget
{
public:
	CWnd::CWnd(){cout<<"CWnd Constructor \n";}
	CWnd::~CWnd(){cout<<"CWnd Destructor \n";}
};

class CFrameWnd:public CWnd
{
public:
	CFrameWnd::CFrameWnd(){cout<<"CFrameWnd Constructor \n";}
	CFrameWnd::~CFrameWnd(){cout<<"CFrameWnd Destructor \n";}
};

class CView:public CWnd
{
public:
	CView::CView(){cout<<"CView Constructor \n";}
	CView::~CView(){cout<<"CView Destructor \n";}
};

//global function
CWinApp* AfxGetApp();

//mfc.cpp

#include "my.h"
extern  CMyWinApp theApp;
CWinApp* AfxGetApp()
{
	return theApp.m_pCurrentWinApp;
}

//my.h

#include<iostream.h>
#include "mfc.h"

class CMyWinApp:public CWinApp
{
public:
	CMyWinApp::CMyWinApp(){cout<<"CMyWinApp Constructor \n\n";}
	CMyWinApp::~CMyWinApp(){cout<<"CMyWinApp Destructor \n";}
};

//my.cpp

#include "my.h"

CMyWinApp theApp; //global object

void main()
{
	CWinApp* pApp = AfxGetApp();

}

运行效果如下:

解析:

于是,你看到了,Frame1并没有new 任何对象,反倒是有一个全局对象 theApp存在,C++规定:全局对象的构建将比程序进入点(在DOS环境为main,在Windows环境为WinMain)更早,所以theApp 的构造函数将早于main()函数。即,上述构造函数的输出操作(XXX Constructor )都是在main()函数之前完成的。

main()函数调用全局函数AfxGetApp()来获得theApp的对象指针,这完全是仿真MFC程序的手法。

参考文献:侯俊杰.深入浅出MFC(第二版).武汉.华中科技大学出版社,2001

时间: 2024-08-11 05:40:41

MFC对象的创建顺序的相关文章

java类的初始化和对象的创建顺序

学习java编程思想--类的初始化p146 类的加载顺序* 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类* 2类初始化先初始化static成员变量和static--->* 2先初始化父类的static成员变量和static* 3再初始化本类的static成员变量和static * 类加载之后,对象创建开始* 1先加载父类的非静态成员变量(静态成员变量在类初始化的时候已经加载,非静态成员变量要随对象的创建而初始化)* 2先加载父类的构造函数* 3再加载本类

MFC 程序 手写创建顺序

MFC 程序 手写创建顺序 1.继承CWinApp类 覆盖 class CMyApp : public CWinApp { virtual BOOL InitInstance(); } BOOL CMyApp::InitInstance() { CMyFrameWnd *pWnd = new CMyFrameWnd(); pWnd->ShowWindow(SW_SHOW); m_pMaindWnd = pWnd; return TRUE; } 2.继承 CFrameWnd类 class CMyF

MFC程序消息处理的顺序

MFC应用程序中处理消息的顺序1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_

MFC程序的消息处理顺序

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.OnWndMsg()        该函

MFC应用程序创建窗口的过程 good

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.OnWndMsg()        该函

对象实例化的顺序

对象实例化的顺序 分类:java, 基础日期:2012-11-08作者:ticmy http://www.ticmy.com/?p=302 创建一个对象大概有以下几种方式:1.通过new关键字,如new Object();2.通过某些反射类的newInstance方法,如Class#newInstance.Constructor#newInstance;3.如果对象是Cloneable的,通过clone方法;4.通过ObjectInputStream#readObject反序列化;以上是通过ja

JVM中对象的创建

对象的创建 加载class 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程, 分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来,有两种分法(选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

数据库对象的创建和管理

--数据库对象的创建和管理 DDL(数据定义语言) --表(table): 数据库存储的基本单元; --约束条件(constraint):用来确保数据库中数据的完整性,确保数据满足某些特定的商业规则 --视图(view):一个或多个表的逻辑表示或虚拟表示,主要用于简化查询操作 --索引(index):用于加速数据访问数据库对象,提高访问效率 --序列(sequence):用于生成唯一数字值的数据库对象,序列的生成机制会自动生成顺序递增的数字,可以用来作为数据表的主键值 --同义词(synonym