您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > 应用软件设计09 研究生课件
应用软件设计关于CObList的SerializeCObList的Serialize是存储和提取CObList的数据的。CObList能通过Serialize存取List吗?下面是CObList的Node(结点)的定义:structCNode{CNode*pNext;//pointtonextnodeCNode*pPrev;//pointtoprevnodeCObject*data;};if(ar.IsStoring()){ar.WriteCount(m_nCount);for(CNode*pNode=m_pNodeHead;pNode!=NULL;pNode=pNode-pNext){arpNode-data;}}else{DWORDnNewCount=ar.ReadCount();CObject*newData;while(nNewCount--){arnewData;AddTail(newData);}}保存count保存node的数据data读取count读取node的数据dataif(ar.IsStoring()){ar.WriteCount(m_nCount);for(CNode*pNode=m_pNodeHead;pNode!=NULL;pNode=pNode-pNext){arpNode-pShape;}}else{DWORDnNewCount=ar.ReadCount();CObject*pNewShape;while(nNewCount--){arpNewShape;AddTail(pNewShape);}}将data换成pShape保存的是指针!读取的也是指针!List指针存取的后果如果是程序在调用Serialize的存储后不退出立即提取,则可恢复原指针。如果是程序在调用Serialize的存储后退出,不关机重新运行程序进行提取,此时很危险。指针有可能正确,也有可能错误。如果程序在调用Serialize的存储后关机,再启动后运行程序,这时指针完全无效。这时候读取的指针是完全错误的。关于CObList的串行化CObList类的特点:1)添加到List的只是指针,用RemoveAt()或RemoveAll()删除的是指针。指针所代表的对象并没有删除。2)Serialize只是针对挂在List上的指针。如果是文件的保存和读取,则这种Serialize没有意义。会出现“不可预期的错误”之类的警告。3)在Serialize的读取状态(IsLoading()),读取时,不删除原来的List,直接添加。(AddTail(newData))改造CObList—基类添加函数classCShape{……public:staticvirtualCShape*NewShape();virtualCStringGetClassName();……};------------------------------------CShape*CShape::NewShape(){returnnewCShape;}CStringCShape::GetClassName(){return“CShape”;}一定要是静态的!改造CObList—派生类添加函数classCMyLine:publicCShape{……public:staticCShape*NewShape();virtualCStringGetClassName();……};------------------------------------CShape*CMyLine::NewShape(){return(CShape*)newCLine;}CStringCMyLine::GetClassName(){return“CMyLine”;}改造CObList—新建ListclassCMyObList:publicCObList{……public:voidDeleteAt(POSITIONpos);voidDeleteAll();……};------------------------------------voidCMyObList::DeleteAt(POSITIONpos){deleteGetAt(pos);CObList::RemoveAt(pos);}添加两个函数!改造CObList—新建ListclassCMyObList:publicCObList{……public:voidDeleteAt(POSITIONpos);voidDeleteAll();virtualvoidSerialize(CArchive&ar);……};------------------------------------再改写Serialize函数voidCMyObList::Serialize(CArchive&ar){if(ar.IsStoring()){ar.WriteCount(m_nCount);for(CNode*pNode=m_pNodeHead;pNode!=NULL;pNode=pNode-pNext){CShape*pShape=(Shape*)pNode-data;arpShape-GetClassName();pShape-Serialize(ar);}}…...CMyObList—保存调用结点的Serialize!else//IsLoading(){DWORDnNewCount=ar.ReadCount();if(nNewCount0)DeleteAll();while(nNewCount--){CStringstrClassName;arstrClassName;CShape*newShape=NewShape(strClassName);newShape-Serialize(ar);AddTail(newShape);}}}//endSerializeCMyObList—读取需要添加的函数清空链表CShape*CMyObList::NewShape(CString&strClassName){CShape*pShape=NULL;if(strClassName==“CMyLine”)pShape=CMyLine::NewShape();elseif(strClassName==“CMyRect”)pShape=CMyRect::NewShape();elseif……;returnpShape;}CMyObList—NewShapeCShape类的每个派生类都必须在这儿实现New!§1关于动态连接库动态连接库DLL的创建是很简单的。工程添加工程newprojectsMFCAppWizard(dll)DLL中创建的类如果要别的模块调用,则必须在类声明中加:AFX_CLASS_EXPORT,例如:classAFX_CLASS_EXPORTCShape{…};这个声明所在的文件必须共享,让别的需要调用它的模块包含。§1关于动态连接库按工程设置目录:Include//公用头文件.h文件Lib//公用库文件.lib文件Debug//调试目录.exe.dllRelease//发布目录.exe.dllMainProj//程序主模块,界面部分.h.cppSystemDll//系统结构模块,动态库.h.cppToolsDll//其他动态库.h.cpp在工具OptionDirectories设置Include,Lib目录在工程(或右键点击工程Folder)SettingsLink中设置Debug和Release的输出目录。工程目录公用头文件目录库目录主模块目录(界面)系统目录工具目录工程联调目录工程发布目录软件开发体系结构软件界面(主模块)核心模块(系统架构)硬件驱动模块网络通信模块数据库访问模块函数库/SDK界面层系统层接口层功能模块功能层外挂插件工程的有关设置1)在include目录中建立统一的Public.h各模块必须调用。Public.h中包含全局定义的结构、数据类型、宏定义、常量和变量等。2)每个模块中有自己的头文件:Module.h(或globals.h)其中调用本模块需要用到的动态库文件、安排好本模块调用的次序。§1关于动态连接库动态连接库的调用方法:1)直接添加法在WorkSpace中右键点击对应的Folder选择AddFilestoProject…将Lib文件添加进来。2)在头文件中说明#ifdef_DEBUG#pragmacomment(lib,“SystemD.lib)#else#pragmacomment(lib,“System.lib)#endif§1关于动态连接库3)在程序中动态调用:HINSTANCELoadLibrary(LPCTSTRlpLibFileName//addressof//filenameofexecutablemodule);§2实现MyPaint界面程序1.建立程序图标文件OpenMSPAINT.EXE(用resource)获取Icon改名IDR_MAINFRAME在CMainFrame::OnCreate中添加:HICONhIcon=AfxGetApp()-LoadIcon(IDR_MAINFRAME);SetIcon(hIcon,TRUE);//SetbigiconSetIcon(hIcon,FALSE);//Setsmallicon§2实现MyPaint界面程序1.建立程序图标2.将ColorPane,MyImage,MyToolbar,OptionZone程序加入到工程中3.建立Toolbar资源:IDR_COLORPANE4.在MainFrm.h中加入CColorPanem_wndColorPane;5.在MainFrm.cpp的OnCreate中加入与ColorPane有关的代码。§2实现MyPaint界面程序6.在ResourceView中修改Toolbar中IDR_MAINFRAME的内容,包括各图标的ID。7.在classCMainFrame中添加CMyToolBarm_wndToolBar;8.在MainFrm.cpp中添加m_wndToolBar相应的代码。§3设置输出目录原来的工程输出到当前目录下,现在需要重新定向。工程(XP99Paint)projectsettingsLink:Category:GeneralOutputfilename将Debug/XP99Paint.exe改成:../Debug/XP99Paint.exeXP99ShapeDll的改法相同,只不过它的输出文件后面不需要带Dll。Debug版为:XP99ShapeD.dllRelease版为:XP99Shape.dll§4动态库的设置同样需要重新定向。工程(XP99Paint)projectsettingsLink:Category:GeneralOutputfilename将Debug/XP99ShapeD.dll改成:../Debug/XP99Shape.dll还要修改lib的输出目录:ProjectOptions:/implib:lib/XP99ShapeDll.lib改成:/implib:../lib/ShapeD.libRelease改成:../lib/Shape.lib§2软件结构:三个封装级别1.面向机器2.面向过程3.面向对象LOOP:moveax,[py]movebx,[pu]movecx,[pv]movedx,[dst]movesi,21hmovedi,[Picture]jlLOOPintCreate(intParam){if(Param==1)return0;elsereturn1;}classCMainFrame{public:CMainFrame();protected:intm_wndToolBar;private:intm_nParam;};§2.1模块独立性性:耦合模块间相对独立性(相互依赖程度)的度量耦合性
本文标题:应用软件设计09 研究生课件
链接地址:https://www.777doc.com/doc-3437670 .html