初学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<CString ,CString&> list;//链表对象1
CList<CString,CString> list2;//链表对象2
这里的第一个参数CString是实例化的类型,第二个参数是类的成员函数的参数的调用形式,通常是类型 引用,当然也可以是对象,而不是引用。对象和引用的区别,可以看一下C++基础知识方面的书。
3、使用CList的迭代器
迭代器是近年在链表使用中的一个常用技术。如果大家学过java,就会知道,在java中,会有专门的一个迭代器类,这个迭代器类用来访问Collect中的数据元素。在mfc中,在CList中,定义了几个迭代器的函数。他们方便了我们去访问数据元素。
GetHeadPosition |
Returns the position of the head element of the list. |
GetTailPosition |
Returns the position of the tail element of the list. |
GetNext |
Gets the next element for iterating. |
GetPrev |
Gets the previous element for iterating. |
以上是四个迭代器函数。前两个他们的返回值是POSITION,它是mfc中定义的的一种专门访问Collect类的一个数据类型。用他来表示元素的位置。
// abstract iteration position
struct __POSITION { };
typedef __POSITION* POSITION;
以上是在跟踪POSITION定义中找到的。由此,我们知道POSITION是个抽象的迭带器位置。至于怎么实现,我也只能知道这么多,如果有哪位高手知道的话,一定要告诉我们哦。
下面我们利用给出的迭代器函数,对下面建立的链表进行遍历:
CList<CString ,CString&> 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的数据保存到文件,并能读取了。
分享到:
相关推荐
CList 是 MFC 中的一个双向链表类,经常在项目中使用,但初学者往往对其使用感到迷惑。下面将详细介绍 CList 的使用注意和知识点。 头文件名不可少 CList 类定义在 Afxtempl.h 头文件中,因此在使用该类时,需要加...
对于系统定义的类,可以直接在 CList 中使用。而对于用户自定义的类,如果这个类继承了 CObject 类,在使用 CList 时,需要将用户自定义的类实现操作符=的重载,否则系统将会报错。 例如,我们可以定义一个 CNode ...
通过学习和实践CList的使用,你可以更好地理解和掌握MFC中的容器类,从而提高在VC6.0环境下开发应用程序的能力。结合实际项目中的数据结构需求,灵活运用CList可以大大提高代码的可读性和可维护性。
在Microsoft Foundation Classes (MFC) 中,`CList` 是一个非常重要的容器类,它用于存储元素的集合,这些元素可以是任何类型,通常是以链表的形式组织。然而,MFC 的 `CList` 类并没有提供内置的排序功能,这与STL...
在Visual C++(VC)的Microsoft Foundation Classes(MFC)编程中,CList是一个非常实用的模板类,用于创建双向链表数据结构。CList提供了一系列操作链表的方法,包括添加、删除、获取链表中的元素等。它广泛用于...
MFC的核心思想是将Windows API的底层函数封装为面向对象的类,使开发者可以使用更加抽象和易于理解的方式来构建用户界面、处理消息以及管理数据。以下是一些关键的MFC类及其作用: 1. CWinApp:这是每个MFC应用程序...
在MFC中,可以使用CList或CArray类,遍历未排序的元素,逐个将其插入到正确的位置。 快速排序是一种高效的排序算法,由Tony Hoare在1960年提出。它采用分治策略,选择一个“基准”元素,将数组分为两部分:小于基准...
这里涉及的知识点包括MFC的CArray或CList容器的使用,以及如何通过GetItemText获取List Control中每一项的文本。 接下来,我们需要使用Excel Automation来创建一个新的Excel工作簿,并在其中写入数据。这需要包含...
在OnDrawItem()中,我们可以使用CDC类的FillSolidRect()函数填充自定义颜色。 首先,定义一个枚举值,如`enum RowColor { NormalColor, HighlightColor };`,然后在数据结构中添加一个成员来存储行的颜色状态。在...
4. 使用CListCtrl类:MFC提供了CListCtrl类来操作ListControl。我们可以通过成员函数来添加、删除项,获取选中项等。 二、实现文件拖放功能 1. 添加消息映射:在头文件中,添加处理WM_DROPFILES消息的声明,如ON_...
MFC数据类库是MFC的一部分,包含了一系列封装了常见数据结构的类,如cstring、cstring_array、cmap、carray、cptrarray和clist等。这些类使得开发者能更方便地处理字符串、数组、映射和列表等数据结构。在标题...
在C++编程中,链表是一种非常重要的数据结构,...通过以上讨论,我们了解了如何在MFC环境中使用CList类进行链表操作,特别是如何实现链表的合并。理解这些概念和技巧,将有助于我们在实际编程中更有效地处理链表数据。
在MFC中,可以使用`CArray`或`CList`等容器类来存储和操作这些数据。 5. **事件处理** MFC的事件驱动模型使得响应用户输入变得简单。通过消息映射机制,我们可以为控件定义消息处理函数,例如处理鼠标点击、键盘...
此外,MFC还提供了许多辅助类,如集合类(CArray, CList, CMap等),智能指针(CPtrList, CObjectPtr等),以及网络和数据库支持等。 总的来说,MFC是Visual C++ 6的重要组成部分,对于开发Windows桌面应用程序来说不可...
在本项目中,"MFC小游戏 贪吃蛇"是一个使用MFC框架实现的经典小游戏——贪吃蛇。 贪吃蛇游戏起源于1976年,由布鲁斯·弗莱明和罗伯特·奥尔德里奇在Atari 2600游戏机上开发。游戏的基本机制是玩家控制一条蛇在屏幕...
同时,需要注意的是,为了保证线程安全,可能需要在多线程环境中使用互斥量(mutex)或信号量(semaphore)来同步访问观察者列表。 结合你提供的压缩包文件,`C++、MFC源代码observer`很可能是实现Observer模式的一...
这可以通过成员变量或者全局变量来实现,也可以使用CObArray、CList或其他容器类存储这些数据。 4. **主对话框的确定按钮处理**: 在主对话框的OnOK()函数中,你需要检查当前选中的TabCtrl页,并获取对应的子...
在Windows编程中,CListControl是MFC(Microsoft Foundation Classes)库中用于创建类似Windows资源管理器风格的列表视图控件的一个类。这个控件允许我们显示多列数据,并可以进行排序、筛选等操作。在某些场景下,...
通过合理利用MFC提供的CFile、CArray、CList、CString等类,以及标准库中的IP处理函数,可以构建出高效、稳定的IP查询系统。在实际编程过程中,一定要注意错误处理,确保在文件读取或查找失败时能够给出适当的反馈。...
首先,`MFClist`指的是MFC中的CList类,它是MFC容器类的一种,用于存储和操作元素列表。CList类提供了动态数组的功能,支持元素的插入、删除和查找等操作。在描述中提到的"list控件"通常是指MFC的CListCtrl类,它是...