欢迎来到天天文库
浏览记录
ID:21625130
大小:145.46 KB
页数:43页
时间:2018-10-23
《分析c++类的动态组件化技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、分析C++类的动态组件化技术 论文:组件 接口 生命周期 C++类 ATL组件类 C++基类 ATL模板基类 继续 论文:在组件化编程的时代,如何复用历史累积的大量没有组件特性的C++类?本文从工程的角度对这一新题目进行探索,利用现有组件技术,提出了一套将C++类平滑过渡到组件的完整解决方案。 1.新题目的提出 自从Microsoft公布了(ponentObjectModel,组件对象模型,简称)技术以后,_pCPPObj记录,在析构时删除,从而实现ATL组件类和C++类的自然绑定。但出于灵活性考虑,使得ATL组件对象可以绑定任意C++类的对象,我们为ATL组件
2、类添加一个绑定函数Link2CPPObj(CImplement*pObj)。 在ATL组件类的构造函数内,创建一个C++对象,用m_pCPPObj记录。 假如调用了Link2CPPObj,则将m_pCPPObj指向的对象删除,改用传进的C++对象。 在ATL组件类的的析构函数内,删除其绑定的C++对象。由构造函数和Link2CPPObj函数的定义可知,m_pCPPObj指针总是有意义的。 简单C++类组件化的思想如下图所示: 2.2.集合型C++类的组件化 集合型C++类的情况有所不同。 集合型C++类以数组(array)、列表(list)、映射表(m
3、ap)的形式治理其它C++对象。集合对象和它治理的元素对象都被包装成组件后,集合型ATL对象可能调用一个“Destroy”方法,期看删除某一个元素ATL对象;这一操纵的实质却是,集合型C++对象的“Destroy”方法被调用,将元素C++对象删除了,而元素ATL对象却不知道。这一操纵的结果导致了元素的ATL对象存在,而其绑定的C++对象却被删除的情况,两者的生命周期出现了不一致。 为了解决这个新题目,我们需要在C++对象被删除时,能将ATL对象同时删除;而在ATL对象的引用计数为0需要删除自身时,也能把C++对象删除。可行的解决方案是: l在C++类中保存一个接口指
4、针,指向绑定在一起的ATL对象;为该接口指针赋值的最佳地点显然是提供绑定机制的Link2CPPObj函数内部,为此,还需要给Link2CPPObj添加一个IUnkno_bInnerManage,作为组件的维护标识。内部维护意味着组件的生命周期由其它组件(集合型组件)维护;外部维护则是由客户维护。 缺省情况下,组件是外部创建并维护的,在组件的构造函数内设置外部维护标识。集合型组件创建元素时,需要为元素分别创建一个C++对象和一个ATL对象,然后调用ATL对象的Link2CPPObj函数将两者绑定在一起,在Link2CPPObj函数内修改维护标识。对于第三种情况,可以
5、在外部创建组件由客户转交给集合型组件时,在集合型组件相应方法内重新设置维护标识。 2.4.C++基类 为了对现有C++类的改动最小,我们设计一个基类封装需要为C++类添加的功能。所有需要动态组件化的C++类都必须从这个基类派生,以保证动态组件化中C++对象和ATL对象生命周期的一致。如下图示: 实现代码如下所示:classCCPP2ATLObjBase{CCPP2ATLObjBase();public://IUnkno_pAssociATLUnk;protected:virtual~CCPP2ATLObjBase();};CCPP2ATLObjBase::CC
6、PP2ATLObjBase(){//将IUnkno_pAssociATLUnk=NULL;}CCPP2ATLObjBase::~CCPP2ATLObjBase(){//CPP类的对象析构时,Release对接口的引用if(m_pAssociATLUnk)m_pAssociATLUnk-%26gt;Release();}然后,修改现有各个C++类,使之从CCPP2ATLObjBase派生,如下面代码片断所示:classCImplement:publicCCPP2ATLObjBase{……}; 必须指出的是,在CCPP2ATLObjBase基类中,我们设置的m_pAsso
7、ciATLUnk变量存在和现有C++类成员命名冲突的新题目。但是,考虑到原C++类并没有组件特性,也应该不会有“IUnknoplate%26lt;classT%26gt;classCCPP2ATLTemplateBase:{protected://C++类指针T*m_pCPPObj;//标识继续该模板的ATL对象是否由内部维护BOOLm_bInnerManage;public:/**********************************************************模板的构造函数,实现如下功能:1、neplat
此文档下载收益归作者所有