个人理解:
1.当是CTypedPtrArray、CTypedPtrList时,基类必须是CObArray、CObList,并且必须用调用Serialize读写。
2.当是CArray、CList时,如果TYPE是非cobject的,可以用 << 或者是>> 进行读写。如果TYPE是cobject的,必须用调用Serialize读写,递推,直到非cobject的类型,才能进行使用 << 或者是>> 进行读写。
array:数组,添加移动整个内存,所以慢。查找快,可以下标索引查找。
list:双向链表,添加快,查找慢,无索引,只能通过GetNext等方式进行访问。
map:键值的方式 key -value
这三个数据类型都是派生自cobject。因此都具备文件读写、运行时类型识别、动态创建等性质。
template<class TYPE, class ARG_TYPE = const TYPE&>
CArray<TYPE,ARG_TYPE>
TYPE:对象的类型
ARG_TYPE:指定函数的参数类型
如CArray<int, int> arr;
CList 和CArray 一样的。
Cmap<KEY,VALUE> 如 cmap<int,cstring> map;
延伸:
1.ob 表示派生自cobject的任何对象,cobarray、 coblist ==>> CArray模板可以记录任何形式的对象,而CObArray只能记录继承于CObject类的对象. CObArray obarray;
2.ptr 表示对象的指针。cptrarray、cptrlist ==>> CPtrArray类支持void类型的指针数组,该类的成员函数与CObArray类相应的函数类似,
只是CObArray类的成员函数中使用CObject指针作为参数或返回值类型的地方,在CPtrArray类中都用void类型的指针代替 CPtrArray parray;
从ptr 再一步延伸到类型指针型,即CTypedPtrArray、CTypedPtrList、CTypedPtrMap
template<class BASE_CLASS, class TYPE>
CTypedPtrArray<BASE_CLASS,TYPE>
BASE_CLASS
类型化指针数组类的基类;必须为数组类 ( CObArray
或 CPtrArray
) 。
TYPE:对象的类型
class cperson public cobject;
如CTypedPtrArray<CObArray
, cperson*> parray;
区别:CObArray是CObject的指针数组;CPtrArray类支持void指针数组。Cobject是MFC所有类的基类,此时当然用CObArray存指针方便一些。
上图的,serialize 循环逻辑看不太懂?
CtypedptrList<coblist,cstroke> m_strokerlist;
m_strokerlist.serialize()会先调用coblist的serialize。再经过运算符重载,虚函数等机制,执行cstroke的serialize。
CObArray::Serialize -> ar << m_pData[i] ( carchive 会重载<< 运算符) ->会执行 CArchive::WriteObject(const CObject* pOb) ->void CObject::Serialize(CArchive&) 所以最后才执行cstroke的serialize
见下图
carry<cpoint,cpoint> m_pointArray;
为什么m_pointArray数组调用serialize 函数就可以读取成功了呢?
因为carray类有serialize函数,可以进行读写。