没有合适的资源?快使用搜索试试~ 我知道了~
C++类的动态组件化技术
5星 · 超过95%的资源 需积分: 50 22 下载量 151 浏览量
2010-05-31
13:29:03
上传
评论 1
收藏 124KB DOC 举报
温馨提示
试读
24页
在组件化编程的时代,如何复用历史累积的大量没有组件特性的C++类?本文从工程的角度对这一问题进行探讨,利用现有组件技术,提出了一套将C++类平滑过渡到COM组件的完整解决方案。
资源推荐
资源详情
资源评论
C++类的动态组件化技术
论文关键词:COM 组件 接口 生命周期 C++类 ATL 组件类 C++基类
ATL 模板基类 继承
论文摘要:在组件化编程的时代,如何复用历史累积的大量没有组件特性的 类?
本文从工程的角度对这一问题进行探讨,利用现有组件技术,提出了一套将 类平滑
过渡到 组件的完整解决方案。
1.问题的提出
自从 公布了 (,组件对象模型,简称
)技术以后, 平台上的开发模式发生了巨大的变化,以 为基础的一
系列组件技术将 编程带入了组件化时代,传统的面向对象的软件开发方法已经
逐渐被面向组件的方法所取代。
标准建立在二进制可执行代码级的基础上,不论何种工具、语言开发的组件,只
要符合 规范,就可复用于 、、、 等各种开发环境中。 的语言
无关性将软件复用的层次从源代码级推进到了二进制级,复用更方便,也更安全。
然而, 技术带来全新的软件设计和开发模式的同时,也带来了新的问题。
许多软件公司在开发自己的软件产品过程中,都累积了大量 类,这些代码设计
精良,功能完备,以面向对象的标准来检验无可挑剔。然而,这些代码不支持 ,将无
法在 时代继续被复用。如果它们在软件组件化的趋势中被淘汰,那对软件公司和开
发人员来说都是极大的损失。
专家 曾说过,“。这给了我们一个启示,是否
可以实现一种技术,能够动态的为普通 类加上一层 的封装呢?这样,既可以保
持这些代码自身的完整和特性,使它们能继续应用于原来的系统,也可以在需要作为组件
使用的时候,把它们动态转变成组件,复用于新系统。
一个自然而然的想法是,为每一个 类开发一个只暴露一个接口的 组件,将
原 类的每个 方法都对应于该接口的一个方法,接口方法的实现可以简单的调
用相对应的 类方法即可。这样,程序逻辑由原有的 类控制,但 层的封装
则由组件提供。基本思路如下图所示:
本文就这一技术展开讨论,最终提供一套由普通 类平滑过渡到 组件的完整
解决方案。我们选用 !(" !#,活动模板库,简称 !)作为
组件的开发工具,开发环境为 $%&'。如没有特殊说明,下文中的“
类”指没有组件特性 类,“对象”指 类的实例;“ ! 组件类”指用于包装的
! 类,“ ! 对象”指 ! 组件类的实例。
2.用 ATL 包装 C++类
按上述思路将 对象动态组件化后,所得的组件实际上由两部分组成: ! 组件
对象和绑定的 对象。两者的生命周期互相牵制,但要保持一致。生命周期的管理是
类动态组件化的首要难点。
类分为两种,一种是简单的 类,一种是集合型的 类。集合型的
对象管理一组 对象,负责其创建和删除,维护它们的生命周期。下面,分别就简单
类和集合型 类的组件化技术进行说明,展示解决方案的核心技术。
(&)&简单 类的组件化
为使 ! 组件类可以自由调用 类的方法,需要:
*为 ! 组件类安插一个指针成员变量,指向 类
*提供 ! 对象和 对象的绑定机制
我们可以在 ! 组件类初始化时创建一个 类,用成员变量 +,, 记录,
在析构时删除,从而实现 ! 组件类和 类的天然绑定。但出于灵活性考虑,使得
! 组件对象可以绑定任意 类的对象,我们为 ! 组件类添加一个绑定函数
!-(,,(./)。
在 ! 组件类的构造函数内,创建一个 对象,用 +,, 记录。
如果调用了 !-(,,,则将 +,, 指向的对象删除,改用传入的 对
象。
在 ! 组件类的的析构函数内,删除其绑定的 对象。由构造函数和
!-(,, 函数的定义可知,+,, 指针总是有意义的。
简单 类组件化的思想如下图所示:
(&(&集合型 类的组件化
集合型 类的情况有所不同。
集合型 类以数组(#)、列表()、映射表()的形式管理其它
对象。集合对象和它管理的元素对象都被包装成组件后,集合型 ! 对象可能调用
一个“#方法,期望删除某一个元素 ! 对象;这一操作的实质却是,集合型
对象的“#方法被调用,将元素 对象删除了,而元素 ! 对象却不知道。这
一操作的结果导致了元素的 ! 对象存在,而其绑定的 对象却被删除的情况,两者
的生命周期出现了不一致。
为了解决这个问题,我们需要在 对象被删除时,能将 ! 对象同时删除;而在
! 对象的引用计数为 ' 需要删除自身时,也能把 对象删除。可行的解决方案是:
*在 类中保存一个接口指针,指向绑定在一起的 ! 对象;为该接口指针赋值的
最佳地点显然是提供绑定机制的 !-(,, 函数内部,为此,还需要给 !-(,,
添加一个 .0-/参数
*在 类的析构函数中,判断该接口指针是否为空,如果不为空,则 1 对接
口的引用,引发 ! 对象自身的析构
现在,技术方案如下图所示:
(&2&内部创建的组件和外部创建的组件
集合型 类组件化后仍然是集合型 ! 组件,它可以创建、删除自己管理的组件。
这样,组件的创建就可能有两种情况:
*由客户直接创建
*由客户调用集合型组件的接口方法间接创建
创建方式的不同导致了组件生命周期管理的复杂性。一般说来,组件的创建者负责维
护组件的生命周期。上述两种情况下,分别由客户和集合型组件维护被创建组件的生命周
期。然而,另有一种情况是,客户创建了一个组件,然后送交一个集合型组件管理,现在
维护组件生命周期的责任就由客户转交给了集合型组件。
我们的解决方案必须提供这样的健壮性和灵活性,以维护各种情况下组件的生命周期。
我们为 ! 组件类添加一个 成员 +.3,作为组件的维护标识。内部
维护意味着组件的生命周期由其它组件(集合型组件)维护;外部维护则是由客户维护。
缺省情况下,组件是外部创建并维护的,在组件的构造函数内设置外部维护标识。集
合型组件创建元素时,需要为元素分别创建一个 对象和一个 ! 对象,然后调用
! 对象的 !-(,, 函数将两者绑定在一起,在 !-(,, 函数内修改维护标识。
对于第三种情况,可以在外部创建组件由客户转交给集合型组件时,在集合型组件相应方
法内重新设置维护标识。
(&4&基类
为了对现有 类的改动最小,我们设计一个基类封装需要为 类添加的功能。
所有需要动态组件化的 类都必须从这个基类派生,以保证动态组件化中 对象与
! 对象生命周期的一致。如下图示:
剩余23页未读,继续阅读
资源评论
- xgllrp0032019-03-28不错资料,学习一下!
mengxiangchong
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 物模块模型代码,前往设计物模块所属
- Java面试手册,助力大家面试过五关斩六将,面试成功
- HITK0303MP-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- mybatis动态sql之xml增删改查批量操作示例EmpMapper.xml
- C/C++内存检测工具Sanitizers
- HITK0302MP-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 宝塔批量建站工具,很优秀的宝塔管理工具,基于宝塔api
- HITK0204MP-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- azeryhgtfxhj
- 操作系统实验页面置换算法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功