欢迎来到天天文库
浏览记录
ID:43187535
大小:494.50 KB
页数:144页
时间:2019-10-02
《文档类对象持续性》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第七章文档类对象持续性本章将要学习MFC应用程序框架另一个重要的机制——对象的持续性,本章讲述的重点是对文档类所提供的如何将对象的数据保存到磁盘文件中和如何从磁盘文件中保存的数据恢复对象数据这一机制进行探讨性的分析。7.1CObject根基类MFC中绝大部分的类都是直接或间接从根基类CObject派生得到的,它们都自然地具备了CObject所具有的性质,当然用户从这些MFC类派生的自定义类也同样继承了CObject的性质。因此,理解CObject的性质就有着特别重要的意义。7.1.1CObject类的三大性质持续性、动态性和诊断性是面向对象的类要实现的
2、十分重要的功能。将实现这些功能的基本操作封装在根基类中,使之具有这三方面的性质,从而导致它的派生类都能自然继承这些重要性质是面向对象的类结构设计的精髓之一。1持续性所谓对象的持续性是指将内存中的对象数据保存到持久介质(例如,磁盘文件),或者反过来,从持久介质(例如,磁盘文件)中读取数据然后自动在内存中重建对象,这对于面向对象程序中的数据读写是十分重要的性质。在CObject类中提供持续化操作的是虚拟成员函数Serialize(CArchive&ar)。它的派生类都自动地继承这个虚函数,并且可以重定义派生类中此虚函数的版本,以便实现特定数据的持续化操作。
3、例如,CMyClass是CObject的派生类,只要对Serialize进行重定义,便可以方便地通过调用Serialize对CMyClass对象实现持续化操作。ClassCMyClass:publicCObject{…protected:Serialize(CArchive&ar);…};其中参数CArchive类对象的引用ar提供了被打开的文件(用于读或写)的相关信息和用于读写的缓冲区。只要在Serialize的新版本中添加用于类对象数据持续化的代码,便可以通过ar实现类对象与磁盘文件之间的读写操作,例如,下列代码就可以完成读入文件中的数据对CMyC
4、lass类对象的初始化——重建持续化。(假设CMyClass::Serialize已经定义)CMyClass*pOb=newCMyClass;//初始化CArchive类对象arCFilefile;if(file.Open(“filename.dat”,CFile::modeRead))//文件filename.dat用于保存着描述CMyClass类对象的全部信息{CArchivear(&file,CArchive::load);pOb->Serialize(ar);}ar.Close();file.Close();下面的代码将实现CMyClass对象
5、的数据保存到文件中——保存持续化操作。CMyClassOb;//初始化CMyClass类对象Ob…//初始化CArchive类对象arCFilefile;if(file.Open(“filename.dat”,CFile::modeCreate
6、CFile::modeWrite))//文件filename.dat用于保存描述CMyClass类对象的全部信息{CArchivear(&file,CArchive::store);Ob.Serialize(ar);}ar.Close();file.Close();2动态性CObject类所提供的动态性是最基本
7、形式——回答或者提供类似“我是谁”的服务,但不提供动态性的高级形式——动态创建。CObject的动态性是由成员函数IsKindOf(CRunTimeClass*ptr)提供的。CObject类的派生类都继承了这一方法,只要调用该函数,派生类对象便可以判断该类指针所指的对象是不是该类的对象,例如:CMyClass*pOb;pOb->IsKindOf(RUNTIME_CLASS(CMyClass));//如果是,则返回TRUE,否则返回FALSE。3.诊断性提供将对象的状态转储给调试机制(如Debug输出窗口)的能力。CObject类有两种转储方式:·虚成
8、员函数Dump将类对象的内部数据输出到CDumpContext类对象afxDump中,而afxDump是与调试输出窗口绑定的;·虚成员函数AssertValid用于判断数据的有效性。AppWizard会自动为CObject的派生类加入这两个成员函数的重定义版本,例如定义一个CObject的间接派生类CMyDoc(由CDocument直接派生),自动添加的重定义诊断函数代码:#ifdef_DEBUGvoidCMyDoc::AssertValid()const{CDocument::AssertValid();}voidCMyDoc::Dump(CDump
9、Context&dc)const{CDocument::Dump(dc);}#endif//_
此文档下载收益归作者所有