- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第章MFC集合类
第5章MFC集合类 许多C++程序员都使用标准模板库(STL),因为用它很容易实现数组、链接列表、映射 以及其他容器。STL语言中“容器”指的是保存数据集合的对象。但是在有STL之前,已经有MFC 了。在称为“MFC集合类”的一系列类中,MFC提供了自己的数组、链接列表以及映射的实现途径。虽然在MFC应用桎序中使用STL类非常安全,但许多MFC程序员还是更喜欢用MFC的集合类,一方面原因是他们更熟悉MFC,另一方面原因是不愿意链接两个独立的类库而增加应用程序的EXE的尺寸。 有MFC集合类的帮助,您根本不必从头编写一个链接列表。本章将介绍MFC集合类并深入说明它们的使用和操作。 5.1数组 C和C++的一个最大缺陷是数组不进行边界检查。看一下下面的代码,它反映了C和 C++应用程序中最常见的一种错误: int array[10]; for (int i=0; i=10; i++) array[i] = i + 1; 此代码出错是由于for循环中的最后一次迭代赋值超出了数组的范围。在运行时会产生非法存取错误。 , C++程序员经常通过编写数组类并在内部进行边界检查来解决此问题。下面给出的数组类具有Get和Set函数,用来检查传递给它们的下标,如果传递来的下标无效就进行断言处理: class CArray { protected: int m_nSize; // Number of elements in the array. int* m_pData; // Where the arrays elements are stored. public: CArray (int nSize) { m_nSize = nSize; m_pData = new int[nSize]; } ~CArray () { m_nSize = 0; if (m_pData != NULL) { delete[] m_pData; m_pData = NULL; } } int Get (int nIndex) { assert (nIndex = 0 nIndex m_nSize); return m_pData[nIndex]; } void Set (int nIndex, int nVal) { assert (nIndex = 0 nIndex m_nSize); m_pData[nIndex] = nVal; } }; 用这个简单的类作为整型数组的容器,下列代码在最后一次调用Set时产生断言提示: CArray array (10); for (int i=0; i=10; i++) array.Set (i, i + 1); // Asserts when i == 10. 这样就会避免非法存取错误的发生。 5.1.1 MFC数组类 您不必亲自编写数组类,MFC巳经提供了各种各样的数组。首先是一般的CArray类。 它实际上是一个模板类,利用它可以创建任何数据类项的类型安全数组。在头文件Afxlexn pl.h中定义了CArray。其次是非模板化的数组类,分别为保存特定类型的数据而设计。这些类在Afxcoll.h中定义。表5-1中列出了非模板化的MFC数组类以及它们所保伴的数据类型。 表5-1 恒定类型的MFC数组类 类名 数据类型 CByleArray 8位字节(BYTE) CWordArray 16位字节(WORD) CDWoKlArray 32位双字(DWORD) CUInl Array 无符号整型(UINT) CStringArray CString CPlrAmy void指针 CObArray CObject 指针 只要学会使用这些数组类中的一种,也就学会使用其他数组类,因为它们共享公用的一组成员函数。下例声明了一个包含10个UINT的数组并用数字1到10对它进行了初 始化: CUIntArray array; array.SetSize (10); for (int i=0; i10; i++) array[i] = i + 1; 可以采用相同的方法来声明一个CStrings数组并用整数I到10的文本表示来初始化它: CStringArray array; array.SetSize (10); for (int i=0; i10; i++) {
文档评论(0)