八年级语文上册com课件.ppt

上传人(卖家):ziliao2023 文档编号:5685081 上传时间:2023-05-02 格式:PPT 页数:32 大小:1.55MB
下载 相关 举报
八年级语文上册com课件.ppt_第1页
第1页 / 共32页
八年级语文上册com课件.ppt_第2页
第2页 / 共32页
八年级语文上册com课件.ppt_第3页
第3页 / 共32页
八年级语文上册com课件.ppt_第4页
第4页 / 共32页
八年级语文上册com课件.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、例子(G:File内部交流赵国光comExampleDropTarget)IDropTarget的定义 interface IDropTarget:public IUnknown public:virtual HRESULT STDMETHODCALLTYPE DragEnter(/*uniquein*/IDataObject _RPC_FAR*pDataObj,/*in*/DWORD grfKeyState,/*in*/POINTL pt,/*outin*/DWORD _RPC_FAR*pdwEffect)=0;virtual HRESULT STDMETHODCALLTYPE DragOv

2、er(/*in*/DWORD grfKeyState,/*in*/POINTL pt,/*outin*/DWORD _RPC_FAR*pdwEffect)=0;virtual HRESULT STDMETHODCALLTYPE DragLeave(void)=0;virtual HRESULT STDMETHODCALLTYPE Drop(/*uniquein*/IDataObject _RPC_FAR*pDataObj,/*in*/DWORD grfKeyState,/*in*/POINTL pt,/*outin*/DWORD _RPC_FAR*pdwEffect)=0;Component

3、Object Model(组件对象模型)微软提出的二进制上的组件标准,定义了对象(组件)之间进行通信的协议。COM是一个更好的C+某一个c+库厂商开发生产了一个算法,可以在O(1)时间阶内完成字符串搜索。为了让客户能够简单的使用这个算法,库厂商创建了一个类:FastString示例:faststring.hfaststring.cpp传统上,库厂商分发C+库一直以源码的形式进行.问题:代码复制,多个应用使用相同的代码占用磁盘空间以及内存.代码更新,将源码重新分发,重新编译链接,失去了模块化的特征.应用A 应用C 应用BFastString.objFastString.objFastString

4、.obj为了解决重复代码以及更新困难的问题,将FastString类封装为一个dll是一个马上想到的方法._declspec(dllexport)关键字.引入库(import library)应用A应用C应用BFastString.dllDll引入库C+缺少二进制级别的标准编译器和链接器的兼容性名字的问题,链接时表达符号名字名字的问题,链接时表达符号名字 为了支持函数重载和操作符重载,不同的编译器/链接器会任意修改入口点的符号名字,称为名字改编(name mangling)使用 extern“C”可以消除名字改编现象,但只对全局函数有效.使用模块定义文件(Module Definition F

5、ile DEF).在运行时表达语言的不同特征在运行时表达语言的不同特征 编译器厂商对语言的特征有不同方式的实现,异常(Exception)是一个例子.假如已经解决了编译器和链接器的问题,建立二进制组件的下一个障碍则和封装有关.FastString的Length方法有问题,修改FastString类的定义.FastString dll升级为2.0,解决Length的问题.FastString Dll分版本改名策略.新应用(用修改后的FastString)旧应用FastString.dll(2.0)封装的基础在C+中,这个原则没有应用到二进制层,因为C+类即是接口也是实现.如何做到接口与实现的分离

6、将接口与实现分立成两个实体,在c+中表现为两个类,接口类和实现类.接口类只对一定的数据类型进行描述.实现类对数据类型作具体的实现.接口类的定义class FastString;class _declspec(dllexport)FastStringInf private:FastString*m_pObj;public:FastStringInf(const char*psz);FastStringInf();int Length()const;int Find(const char*psz)const;示例:G:File内部交流赵国光comExamplefaststringdll2编译器/链

7、接器的问题依然没有解决。利用所有编译器/链接器的一致性。复合结构在运行时表现形式对不同编译器一致.所有编译器使用相同的堆栈规则传递参数.所有所有C+编译器实现相同的虚函数调用机制编译器实现相同的虚函数调用机制.也就是说对每个也就是说对每个c+编译器来说,一个对象在内存中编译器来说,一个对象在内存中如何表示,以及在运行时怎样调用虚函数都必须一致如何表示,以及在运行时怎样调用虚函数都必须一致以上三条假设所有编译器必须要遵从.vptr以及vtbladjustor thunk(win32),CFRONT(solaris)vptrv_fun1v_fun2v_fun3vtblFastString的抽象基类

8、class IFastStringpublic:virtual int Length()const=0;virtual int Find(const char*psz)const=0;vptrLengthFindvtblIFastString内存结构class FastString public:IFastStringprivate:const int m_cch;char*m_psz;public:FastString(const char*psz);FastString(void);int Length(void)const;int Find(const char*psz)const;vp

9、tr LengthFindvtblFastString内存结构m_cchm_pszextern“C”IFastString*CreateFastStringObject(const char*psz)return new FastString(psz);new方法在dll内部被调用。考虑如下用法:IFastString*fs=CreateFastStringObject(“hellow everyone”);if(fs)int pos=fs-Find(“very”);delete fs;问题:内存泄露。原因:IFastString的析构函数并不是虚函数。解决办法:显示的使用删除方法删除自身。示

10、例:G:File内部交流赵国光comExamplefaststringdll3减少应用程序初始化的工作。dll不存在也不会导致系统出现错误。在运行时动态选择不同的实现。(另外的意义是组件升级)接口的改变或增加都可能导致客户代码重新编译。class IFastString public:virtual int Delete(void)=0;virtual int Length()const=0;virtual int Find(const char*psz)const=0;/新功能virtual int FindN(const char*psz)const=0;新方法追加在接口定义的尾部,老客户

11、使用新服务可以,反过来则会崩溃。实现类暴露多个接口接口从另一个接口继承实现类从多个接口继承运行时类型识别(RTTI),dynamic_cast.继承接口类定义:class IFastString2:public IFastStringpublic:virtual int FindN(const char*psz)const=0;运行时类型识别用法:int FindNth(IFastString*fs,int n)IFastString2*fs2=dynamic_cast(fs);if(fs2)jreturn fs2-FindN(“very”,n);elseerror(“类型转换失败,不能进行查

12、找”);/或者用别的实现return-1;/永久性对象class IPersistObjectpublic:virtual void Delete()=0;virtual bool Load(const char*filename)=0;virtual bool Save(const char*filename)=0;/支持永久性的Faststringclass FastString:public IFastString,public IPersistObject private:int m_cch;char*m_psz;public:FastString(const char*psz);Fa

13、stString(void);void Delete(void);/IFastString 的方法int Length(void)const;int Find(const char*psz)const;/IPersistObject 的方法bool Load(const char*filename);bool Save(const char*filename);bool SaveString(IFastString*fs,char*filename)IPersistObject*po=dynamic_cast(fs);if(po)return po-Save(filename);else re

14、turn false;RTTI 是与编译器相关的特性,不同的变异其厂商对其有着不同的实现。这样就破坏了以抽象基类作为接口而获得的编译器独立性。解决方法:每个接口自己实现dynamic_cast的功能,这样仍然保持编译器独立性。class IPersistObjectpublic:virtual void*Dynamic_Cast(const char*type)=0;virtual void Delete()=0;virtual bool Load(const char*filename)=0;virtual bool Save(const char*filename)=0;class IFa

15、stStringpublic:virtual void*Dynamic_Cast(const char*type)=0;virtual void Delete()=0;virtual int Length()=0;virtual int Find(const char*psz)=0;/extract methodclass IBaseObjectpublic:virtual void*Dynamic_Cast(const char*type)=0;virtual void Delete()=0;class FastString:public IFastString,public IPersis

16、tObject/;void*FastString:Dynamic_Cast(const char*type)if(strcmp(type,”IFastString”)=0)return static_cast this;else if(strcmp(type,”IPersistObject”)=0)return static_cast this;else if(strcmp(type,”IBastObject”)=0)return static_castthis;/?return NULL;转为IFastString的原因:多继承引起的二义性。消除多继承引起的二义性可以使用虚基类技术,但c+里

17、虚基类同样是编译器相关的特性。void f(void)IFastString*pfs=0;IPersistObject*ppo=0;pfs=CreateFastString(“Hello every body.);if(pfs)ppo=(IPersistObject*)pfs-Dynamic_Cast(IPersistObject);if(!ppo)pfs-Delete();else ppo-Save(C:test.txt);ppo-Delete();创建的对象是IFastString指针接收的,但却是用IPersistObject接口Delete,并且对象只能被释放一次。在此,由于他们都是指

18、向的同一个对象,所以资源释放没问题,但是如果在复杂的代码中,包含多个接口,多个对象的时候,资源释放将变得非常复杂和不易控制。解决方法:将资源释放部分放到实现内部,每个对象自己控制自己的生命周期。/基类抽象接口class IBaseObjectvirtual void*Dynamic_Cast(const char*type);/virtual void Delete(void);virtual void AddPointer();virtual void DelPointer();/实现实现类维护一个变量,在指针复制的时候增加,指针不用的时候减少,减至0时将对象销毁。class FastStr

19、ing:public IFastString,public IPersistObjectint m_pcount;public:void AddPointer()m_pcount+;void DelPointer()if(-m_pcount=0)delete this;接下来需要修改管理指针的接口,在指针被复制的时候调用AddPointer.对FastString Dll来说,有两个地方需要修改,一是创建对象接口CreateFastStringObject,一是运行时动态类型转换接口Dynamic_Castvoid*FastString:Dynamic_Cast(const char*type

20、)void*obj=NULL;if(strcmp(type,”IFastString”)=0)obj=static_cast this;else if(strcmp(type,”IPersistObject”)=0)obj=static_cast this;else if(strcmp(type,”IBastObject”)=0)obj=static_castthis;/?elsereturn NULL;if(obj)(IBaseObject*)obj)-AddPointer();return obj;extern“C”IFastString*CreateFastStringObject(co

21、nst char*psz)IFastString*fs=new FastString(psz);fs-AddPointer();return fs;void f(void)IFastString*pfs=0;IPersistObject*ppo=0;pfs=CreateFastString(“Hello every body.);if(pfs)ppo=(IPersistObject*)pfs-Dynamic_Cast(IPersistObject);if(ppo)ppo-Save(C:test.txt);ppo-DelPointer();pfs-DelPointer();1,用dll发布FastString。2,将接口和实现分离,使修改实现类无需重新编译客户系统。3,采用抽象基类作为二进制接口。4,运行时可动态选择同一接口的不同实现。(LoadLibrary)5,仿RTTI,实现Dynamic_Cast,运行时查询接口。6,谢谢。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(八年级语文上册com课件.ppt)为本站会员(ziliao2023)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|