分析c++类的动态组件化技术

分析c++类的动态组件化技术

ID:21625130

大小:145.46 KB

页数:43页

时间:2018-10-23

分析c++类的动态组件化技术_第1页
分析c++类的动态组件化技术_第2页
分析c++类的动态组件化技术_第3页
分析c++类的动态组件化技术_第4页
分析c++类的动态组件化技术_第5页
资源描述:

《分析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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。