有了上面两个函数,我们在程序执行的时候调用,就可以动态创建对象了。
简单实现动态创建:
我们还可以更简单地实现动态创建,大家注意到,就是在我们的程序类里面有一个RUNTIME_CLASS(class_name)宏,作用就是得到类的RunTime信息,即返回class_name所属CRuntimeClass的对象。这个宏在MFC里定义为:
RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
在我们的应用程序类(CMyWinApp)的InitInstance()函数下面的CSingleDocTemplate函数中,有:
RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CMyView)
构造文档模板的时候就用这个宏得到文档、框架和视的RunTime信息。有了RunTime信息,我们只要一条语句就可以动态创建了,如:
classMyView->CreateObject(); //对象直接调用用CRuntimeClass本身的CreateObject()
总结:
最后再总结和明确下动态创建的具体步骤:
- 定义一个不带参数的构造函数(默认构造函数);因为我们是用CreateObject()动态创建,它只有一条语句就是return new XXX,不带任何参数。所以我们要有一个无参构造函数。
- 类说明中使用DECLARE_DYNCREATE(CLASSNMAE)宏;和在类的实现文件中使用IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)宏;这个宏完成构造CRuntimeClass对象,并加入到链表中。
- 使用时先通过宏RUNTIME_CLASS得到类的RunTime信息,然后使用CRuntimeClass的成员函数CreateObject创建一个该类的实例。
- CObject* pObject = pRuntimeClass->CreateObject();//完成动态创建。
文档永久保存(串行化、序列化)
我们可以利用CArchive类将对象数据保存到永久设备上,这样,即使应用程序关闭,我们也可以将从磁盘文件中读取对象数据,然后在内存中重新构建相应的对象,这种让对象数据持久性的过程,即MFC的连续存储机制称之为序列化(Serialize)。
MFC文档的序列化过程包括:创建空文档、打开文档、保存文档和关闭文档四个操作。
从单文档的序列化过程可以看出:打开和保存文档时,系统都会调用Serialize函数。事实上,MFC AppWizard在创建文档应用程序框架时已在文档类中重载了Serialize函数,通过在该函数中添加代码可达到实现数据序列化的目的。
消息映射、消息传递四川中医肝病医院