carray 、clist、cmap

23 篇文章 2 订阅

个人理解:

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函数,可以进行读写。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值