atl中的集合和枚举 一
com中集合和枚举器的关系非常类似于stl中的容器和迭代器的关系。
枚举器
如果一个com对象可以被称为一个“集合”,那么很显然,该对象内部肯定是一些类型相同的数据的集合,当我们要将内部这些数据“暴露”给客户端使用时,如果直接照搬stl的模式,提供一个iterator型别,那么会造成服务器端的数据封装得太弱,数据易被客户端破坏。鉴于此,com提供了枚举器供客户使用——客户通过集合的接口,取得枚举器的接口,使用枚举器访问数据;除开枚举器接口以外,一般的集合对象还要提供get__item方法暴露自身数据。
假设icollection接口支持枚举器ienumsth,那么通过如下代码得到枚举器接口,枚举内部元素:
hresult hres ;
ienumsth psth ;
hres = icollection->get__newenum( (iunknown**) &psth ) ;
我们的程序中并没有提供ienumsth的声明,com规定了,凡是ienumxxx类型的接口,都需要用有如下四个方法:next,skip,reset,clone。很明显,get__newenum()方法的作用就是构造出一个对象(下面称其为枚举器对象),该对象实现了上面所列的4个方法,然后将该对象的接口指针返回给客户端即可。
atl提供了一个枚举器对象的通用实现模板,极大的方便了我们的工作。该枚举器对象模板的设计思想是“基于策略”的,让我们首先来看看要实现该模板,需要有哪些策略:
1、 枚举器接口的名字——也就是上面例子中的ienumsth
本文关键:ATL 集合 枚举