![MFC的数据类型 MFC的数据类型](http://s3.sinaimg.cn/middle/7ce2cb41xbb20682d5682&690)
MFC数据类型分为3类
Array:数组
List:双向链表
Map:又称为Dictionary,其内对象成对存在,一为键值对象(key object),一为实值对象(value object) .
![MFC的数据类型 MFC的数据类型](http://s11.sinaimg.cn/middle/7ce2cb41xbb207648caca&690)
MFC Collection classes所支持的对象中,有两种特别需要说明,一是Ob,一是Ptr:
Ob表示派生自CObject的任何对象。MFC提供CObList, CObArray两种类。
Ptr表示对象指针。MFC提供CPtrList, CPtrArray两种类。
下表是对所有collection classes性质的一份摘要整理
![MFC的数据类型 MFC的数据类型](http://s10.sinaimg.cn/middle/7ce2cb41xbb206f7a55c9&690)
![MFC的数据类型 MFC的数据类型](http://s12.sinaimg.cn/middle/7ce2cb41xbb20735d34cb&690)
注释
①若要文件读写,你必须调用collection object的Serialize函数;若要内容倾印,你必须调用其Dump函数。不能够使用archive<<obj或dmp<<obj等形式。
②究竟是否为Serializable,必须视其内含对象而定。举个例子,如果一个typed pointer array是以CObArray为基础,那么它是Serializable;如果它是以CPtrArray为基础,那么它就不是Serializable。一般而言,Ptr都不能够被Serialized。
③虽然它是non-template,但如果照预定数据类型去使用它(例如以CByteArray储存bytes而不是用来储存char),那么它还是type-safe的。
④手册上说它并非Serializable,但我存疑。各位不妨试验之。
Template-Based Classes的使用方法
简单型template-based classes使用时需要指定参数:
.CArray<TYPE,ARG-TYPE>
.CList<TYPE,ARG-TYPE>
.CMap<KEY,ARG-KEY,VALUE,ARG-VALUE>
其中TYPE用来指定你希望收集的对象的类型,它们可以是:
.C++基础类型,如iht, char, long, float等等。
.C++结构或类。
ARG-TYPE则用来指定函数的参数类型。举个例子,下面的程序表示我们需要一个int数组,数组成员函数(例如Add)的参数是int:
CArray<int,int>mintArray;
m_intArray .Add(15);
再举一例,下面的程序表示我们需要一个由iht组成的链表,链表成员函数(例如AddTail)的参数是int:
CList<int,int>m intList;
m_intList.AddTail(36);
m_intList.RemoveAll();
再举一例,下面的程序表示我们需要一个由CPoint组成的数组,数组成员函数(例如Add)的参数是CPoint:
CArray<CPoint,CPoint>mpointArray;
CPoint point(18,64);
m_pointArray .Add(point);
“类型指针”型的template-based classes使用时亦需指定参数:
.CTypedPtrArray<BASE-CLASS,TYPE>
.CTypedPtrList<BASE-CLASS,TYPE>
.CTypedPtrMap<BASE-CLASS,KEY,VALUE>
其中TYPE用来指定你希望收集的对象的类型,它们可以是:
.C++基础类型,如iht, char, long, float等等。
.C++结构或类。
BASE_CLASS则用来指定基类,它可以是任何用来收集指针的non-template collection classes,例如CObList、CObArray、CPtrList或CPtrArray等等。举个例:
下面程序表示我们需要一个派生自CObList的类,用来管理一个链表,而链表组成部分为CStroke
CTypedPtrList<CObList,CStroke*>m_strokeList;
CStroke*pStroke工tem=new CStroke(20);
m_strokeList.AddTail(pStrokeItem);