carray 、clist、cmap

MFC 同时被 2 个专栏收录
19 篇文章 0 订阅
89 篇文章 1 订阅

个人理解:

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:指定基类,必须是指针列表类。可以是任何 non-template collection classes,即如cobarray、cptrarray、coblist、cptrlist等。

TYPE:对象的类型

class cperson public cobject;

如CTypedPtrArray<CobArray, cperson*> parray;

 

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

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值