金碧小说:CList类

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 09:17:44

CList类

2009-02-10 09:20 4968人阅读 评论(6) 收藏 举报 MFC中CList类使用注意
    初学mfc者,往往对CList等mfc的Collect类的使用感到迷惑,在使用中经常会遇到许多问题,导致对vc中的

Collect类的使用产生了惧怕。以下,就个人经历而言,告诉大家如何使用CList。
CList是一个双向链表类。
1、头文件名不可少
Clist类定义在Afxtempl.h 头文件中,因此在使用该类时,需要加这个头文件名。
2、理解CList的声明和构造方法
CList的声明如下:
template< class TYPE, class ARG_TYPE >class CList : public CObject
由此,我们知道CList是一个模版类,那么他的两个class是什么意思呢?
下面看一个例子:
CList list;//链表对象1
CList list2;//链表对象2
这里的第一个参数CString是实例化的类型,第二个参数是类的成员函数的参数的调用形式,通常是类型 引用,当

然也可以是对象,而不是引用。对象和引用的区别,可以看一下C++基础知识方面的书。
3、使用CList的迭代器
     迭代器是近年在链表使用中的一个常用技术。如果大家学过java,就会知道,在java中,会有专门的一个迭代

器类,这个迭代器类用来访问Collect中的数据元素。在mfc中,在CList中,定义了几个迭代器的函数。他们方便了

我们去访问数据元素。
GetHeadPosition  /  GetTailPosition  /  GetNext  /   GetPrev
以上是四个迭代器函数。前两个他们的返回值是POSITION,它是mfc中定义的的一种专门访问Collect类的一个数据

类型。用他来表示元素的位置。
// abstract iteration position
struct __POSITION { };
typedef __POSITION* POSITION;
以上是在跟踪POSITION定义中找到的。由此,我们知道POSITION是个抽象的迭带器位置。至于怎么实现,我也只能

知道这么多,如果有哪位高手知道的话,一定要告诉我们哦。
下面我们利用给出的迭代器函数,对下面建立的链表进行遍历:
CList list;
CString str1="hello";
CString str2="world";
CString str3="my";
CString str4="life";
list.AddTail(str1);
list.AddTail(str2);
list.AddTail(str3);
list.AddTail(str4);
POSITION pos = list.GetHeadPosition();
while(pos!=NULL)
{
       pDC->TextOut(200,200,GetNext( POSITION& rPosition ) );//假设代码是在View类中的OnDraw()
                                                                                                 //函

数里
}
这样就完成了对list的遍历。
4、CList的其它函数:
      CList的其它函数,大家可以参考一下MSDN,在那里每个函数都讲得很清楚。这里就不再多介绍。
5、CList的元素
      对于系统定义的类,可以直接在CList中使用。而对于用户自定义的类,如果这个类继承自CObject类,在使

用CList时,需要将用户自定义的类实现操作符=的重载,否则系统将会报错。以下举一简单的CNode例子,使之实现

操作符=的重载:
class CNode : public CObject
{
public:
      CPoint point;
      CNode()
     {
            point.x=0;
            point.y=0;
     }
     void operator = (CPoint& p)//运算符=的重载
    {
        point=p;
    }
};
6、CList的序列化:
     CList是一个继承了CObject的类,并且已经实现了Serialize(CArchive& ar)的函数,所以,对CList进行串行

序列化不需要的。
    如果在CList类在CDocument定义了其对象list,那么在文档的Serialize(CArchive& ar)只需作如下修改:
void CDdfDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
   // TODO: add storing code here
   list.Serialize(ar);
}
else
{
   // TODO: add loading code here
list.Serialize(ar);
}
}
这样,就实现了文档的串行化,如果使用mfc生成的框架,那么我们就可以直接将这个list的数据保存到文件,并能

读取了。