计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

C++类的动态组件化技术(4)

2013-10-19 01:11
导读:实现代码如下所示: class CCPP2ATLObjBase { CCPP2ATLObjBase (); public: // IUnknown指针,反指向封装该CPP类的接口 IUnknown* m_pAssociATLUnk; protected: virtual ~ CCPP2ATLObjBase ()

  实现代码如下所示:

class CCPP2ATLObjBase

{

       CCPP2ATLObjBase ();

public:

       // IUnknown指针,反指向封装该CPP类的接口

       IUnknown*    m_pAssociATLUnk;

protected:

       virtual ~ CCPP2ATLObjBase ();

};

CCPP2ATLObjBase::CCPP2ATLObjBase()

{

       // 将IUnknown指针初始化为0

       m_pAssociATLUnk = NULL;

}

CCPP2ATLObjBase::~CCPP2ATLObjBase()

{

       // CPP类的对象析构时,Release对接口的引用

       if (m_pAssociATLUnk)

              m_pAssociATLUnk->Release();

}

然后,修改现有各个C++类,使之从CCPP2ATLObjBase派生,如下面代码片断所示:

class CImplement : public CCPP2ATLObjBase

{

       ……

};

  必须指出的是,在CCPP2ATLObjBase基类中,我们设置的m_pAssociATLUnk变量存在和现有C++类成员命名冲突的问题。但是,考虑到原C++类并没有组件特性,也应该不会有“IUnknown”型指针,因此,只要各个类的变量命名都按照规范的命名法,出现这种名字冲突的可能性是极小的。

  2.5. ATL模板基类

  通过以上分析,我们发现,所有的ATL组件类都需要实现一些相同的功能:

  l 保留一个指向其绑定C++对象的指针

  l 提供一个Link2CPPObj函数

  l 在构造函数中创建一个绑定C++类的对象

  为了减化编码,我们定义一个带参数的模板基类,实现上述功能,模板参数就是绑定的C++类。然后,所有的ATL组件类都从模板基类中派生。现在的技术方案如下图所示:

  

上一篇:家庭自动化系统 下一篇:没有了