书签 分享 收藏 举报 版权申诉 / 32
上传文档赚钱

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

  • 上传人(卖家):ziliao2023
  • 文档编号:5685081
  • 上传时间:2023-05-02
  • 格式:PPT
  • 页数:32
  • 大小:1.55MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《八年级语文上册com课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    年级 语文 上册 com 课件 下载 _其它资料_语文_初中
    资源描述:

    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,谢谢。

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:八年级语文上册com课件.ppt
    链接地址:https://www.163wenku.com/p-5685081.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


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

    163文库