CTypePtrList<BASE_CLASS, TYPE>的结构应用说明

CTypePtrList是微软的一个模板类,这个模板类在线性的存储单元结构中是非常实用的,但是很多人期初用的时候对这个结构的操作不是很了解,对于他的操作觉得很奇怪。如果不知道这个类模板的结构和实现机制的话感觉就会很怪异,为了弄清楚这一点我也是把这个看了两天,把这个模板类的代码重新写了一遍,彻底的明白了这个模板的结构,今天给大家分享一下。

CTypePtrList类的基类是__CTypePtrList<BASE_CLASS, TYPE>,

CTypePtrList类自身的操作并不是很多只有简单的四个函数,分别是:

POSITION AddHead(TYPE newElement){  return BASE_CLASS::AddHead(newElement);  }

POSITION AddTail(TYPE newElement){  return BASE_CLASS::AddTail(newElement);  }
void AddHead(__CTypedPtrList<BASE_CLASS,TYPE> *pNewList)

void AddTail(__CTypedPtrList<BASE_CLASS,TYPE> *pNewList)
这四个函数就是CTypePtrList类自身的操作函数体。使用的人都知道CTypePtrList类的操作函数有很多,这部分

函数体都是隐藏在他的基类当中,基类的函数相对是比较多的,但是基类的实现并没有什么高深的处理过程

仅仅是对某个结构函数的一个调用,下面我们看下基类的组成和结构:

template<class BASE_CLASS,class TYPE>

class __CTypedPtrList : public BASE_CLASS
{
public:
__CTypedPtrList(int nBlockSize = 10) : BASE_CLASS(nBlockSize)
// peek at head or tail
TYPE& GetHead()
{ return (TYPE&)BASE_CLASS::GetHead(); }
TYPE GetHead() const
{ return (TYPE)BASE_CLASS::GetHead(); }
TYPE& GetTail()
{ return (TYPE&)BASE_CLASS::GetTail(); }
TYPE GetTail() const
{ return (TYPE)BASE_CLASS::GetTail(); }
// get head or tail (and remove it) - don't call on empty list!
TYPE RemoveHead()
{ return (TYPE)BASE_CLASS::RemoveHead(); }
TYPE RemoveTail()
{ return (TYPE)BASE_CLASS::RemoveTail(); }
// getting/modifying an element at a given position
TYPE& GetAt(POSITION position)
{ return (TYPE&)BASE_CLASS::GetAt(position); }
TYPE GetAt(POSITION position) const
{ return (TYPE)BASE_CLASS::GetAt(position); }
void SetAt(POSITION pos, TYPE newElement)
{ BASE_CLASS::SetAt(pos, newElement); }
};

通过CTypedPtrList的基类我们发现,__CTypedPtrList所有函数的实现都是基于模板内的第一个参数

BASE_CLASS的,__CTypedPtrList的所有函数都是通过操作BASE_CLASS::XXXX来实现的,所以可以肯定

CTypedPtrList的操作除了他自身的四个函数之外,都是对于BASE_CLASS函数的操作(其实际的实现机制就是如此)。

那么问题来了BASE_CLASS究竟是什么类,用过的人都知道,这其实是一个链表的类,这个类一般会选择一个微软

已经开发好的链表类,当然了如果谁的基础过硬可以自己写一个链表类出来,作为基类也是可以的,但是个人觉得

没有必要。这个BASE_CLASS常用的选择项是CPtrList,这个是微软已经写好的,在微软的开发环境中这个链表的

代码是可见的,有兴趣的人可以自行学习。

那么到此就不难看出,我们在操作CTypedPtrList的时候关于数据的处理其实都是通过,调用BASE_CLASS

(CPtrList)的函数实现的,所以在使用这个模板类的时候总感觉像是在操作链表,其原因就在这里。对于

BASE_CLASS选择一般都是选用微软已经写好的链表类,。基类还有另外一个选的就是CObjList,这个

也是链表的方式实现的,主题功能相差无几。

使用中常用的形式:CTypePtrList<CPtrList, Yourself_Data*> CDataList。

总而言之CTypePtrList没有什么神秘之处,就是一个被微软封装的链表。这个被封装的链表只是比普通的链表更

为通用,在使用中大家只需要把它当做一个链表类就OK了。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值