`
jbm3072
  • 浏览: 211938 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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<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的数据保存到文件,并能读取了。
分享到:
评论

相关推荐

    MFC中CList类使用注意.pdf

    CList 是 MFC 中的一个双向链表类,经常在项目中使用,但初学者往往对其使用感到迷惑。下面将详细介绍 CList 的使用注意和知识点。 头文件名不可少 CList 类定义在 Afxtempl.h 头文件中,因此在使用该类时,需要加...

    MFC中CList类使用注意.docx

    对于系统定义的类,可以直接在 CList 中使用。而对于用户自定义的类,如果这个类继承了 CObject 类,在使用 CList 时,需要将用户自定义的类实现操作符=的重载,否则系统将会报错。 例如,我们可以定义一个 CNode ...

    Clist的使用

    通过学习和实践CList的使用,你可以更好地理解和掌握MFC中的容器类,从而提高在VC6.0环境下开发应用程序的能力。结合实际项目中的数据结构需求,灵活运用CList可以大大提高代码的可读性和可维护性。

    MFC CList 链表 排序,源码实现,已验证,VC++

    在Microsoft Foundation Classes (MFC) 中,`CList` 是一个非常重要的容器类,它用于存储元素的集合,这些元素可以是任何类型,通常是以链表的形式组织。然而,MFC 的 `CList` 类并没有提供内置的排序功能,这与STL...

    CList用法及其成员的使用

    在Visual C++(VC)的Microsoft Foundation Classes(MFC)编程中,CList是一个非常实用的模板类,用于创建双向链表数据结构。CList提供了一系列操作链表的方法,包括添加、删除、获取链表中的元素等。它广泛用于...

    MFC.rar_mfc 全部类

    MFC的核心思想是将Windows API的底层函数封装为面向对象的类,使开发者可以使用更加抽象和易于理解的方式来构建用户界面、处理消息以及管理数据。以下是一些关键的MFC类及其作用: 1. CWinApp:这是每个MFC应用程序...

    MFC 实现排序操作

    在MFC中,可以使用CList或CArray类,遍历未排序的元素,逐个将其插入到正确的位置。 快速排序是一种高效的排序算法,由Tony Hoare在1960年提出。它采用分治策略,选择一个“基准”元素,将数组分为两部分:小于基准...

    vc 将List Control中的数据写入Excel表格---- 数据库操作法

    这里涉及的知识点包括MFC的CArray或CList容器的使用,以及如何通过GetItemText获取List Control中每一项的文本。 接下来,我们需要使用Excel Automation来创建一个新的Excel工作簿,并在其中写入数据。这需要包含...

    MFC中改变list control满足条件的某一行的背景颜色

    在OnDrawItem()中,我们可以使用CDC类的FillSolidRect()函数填充自定义颜色。 首先,定义一个枚举值,如`enum RowColor { NormalColor, HighlightColor };`,然后在数据结构中添加一个成员来存储行的颜色状态。在...

    MFC ListControl 控件 拖拽文件扩展

    4. 使用CListCtrl类:MFC提供了CListCtrl类来操作ListControl。我们可以通过成员函数来添加、删除项,获取选中项等。 二、实现文件拖放功能 1. 添加消息映射:在头文件中,添加处理WM_DROPFILES消息的声明,如ON_...

    template_Custom_MFC_MFC数据类库跨平台移植_

    MFC数据类库是MFC的一部分,包含了一系列封装了常见数据结构的类,如cstring、cstring_array、cmap、carray、cptrarray和clist等。这些类使得开发者能更方便地处理字符串、数组、映射和列表等数据结构。在标题...

    C++链表的合并(MFC程序开发)

    在C++编程中,链表是一种非常重要的数据结构,...通过以上讨论,我们了解了如何在MFC环境中使用CList类进行链表操作,特别是如何实现链表的合并。理解这些概念和技巧,将有助于我们在实际编程中更有效地处理链表数据。

    MFC 编写的迷宫游戏

    在MFC中,可以使用`CArray`或`CList`等容器类来存储和操作这些数据。 5. **事件处理** MFC的事件驱动模型使得响应用户输入变得简单。通过消息映射机制,我们可以为控件定义消息处理函数,例如处理鼠标点击、键盘...

    VC6的MFC文件

    此外,MFC还提供了许多辅助类,如集合类(CArray, CList, CMap等),智能指针(CPtrList, CObjectPtr等),以及网络和数据库支持等。 总的来说,MFC是Visual C++ 6的重要组成部分,对于开发Windows桌面应用程序来说不可...

    MFC小游戏 贪吃蛇

    在本项目中,"MFC小游戏 贪吃蛇"是一个使用MFC框架实现的经典小游戏——贪吃蛇。 贪吃蛇游戏起源于1976年,由布鲁斯·弗莱明和罗伯特·奥尔德里奇在Atari 2600游戏机上开发。游戏的基本机制是玩家控制一条蛇在屏幕...

    C++、MFC源代码observer

    同时,需要注意的是,为了保证线程安全,可能需要在多线程环境中使用互斥量(mutex)或信号量(semaphore)来同步访问观察者列表。 结合你提供的压缩包文件,`C++、MFC源代码observer`很可能是实现Observer模式的一...

    MFC中 ,点击主窗口的确定按钮获取tabctrl子对话框的文本.docx

    这可以通过成员变量或者全局变量来实现,也可以使用CObArray、CList或其他容器类存储这些数据。 4. **主对话框的确定按钮处理**: 在主对话框的OnOK()函数中,你需要检查当前选中的TabCtrl页,并获取对应的子...

    设置CListControl的颜色,图片

    在Windows编程中,CListControl是MFC(Microsoft Foundation Classes)库中用于创建类似Windows资源管理器风格的列表视图控件的一个类。这个控件允许我们显示多列数据,并可以进行排序、筛选等操作。在某些场景下,...

    MFC读取纯真IP数据库

    通过合理利用MFC提供的CFile、CArray、CList、CString等类,以及标准库中的IP处理函数,可以构建出高效、稳定的IP查询系统。在实际编程过程中,一定要注意错误处理,确保在文件读取或查找失败时能够给出适当的反馈。...

    student2p0_obj2p_MFClist_MFC_

    首先,`MFClist`指的是MFC中的CList类,它是MFC容器类的一种,用于存储和操作元素列表。CList类提供了动态数组的功能,支持元素的插入、删除和查找等操作。在描述中提到的"list控件"通常是指MFC的CListCtrl类,它是...

Global site tag (gtag.js) - Google Analytics