- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Ctypedptrlist模板类使用心得
CtypedPtrListCObList,Circle * m_CirList;
CtypedPtrList是一个链表模板类, 里面有一些操作方法,如GetNext()、GetAt()等操作。
参数1:第一个参数说明是列表的基类,这里必须是个指针列表类(Coblist或者CPtrlist,自己觉得用其他的列表类也可以,只要是指针列表类)
object,所以,拥有Serialize()序列化的操作。
参数2:第二个参数指在列表类中所存放的类型GetHeadPosition()
这个是用来获取链表头的方法;
返回值类型: POSITION
例1:POSITION pos=pDoc-m_CirList.GetHeadPosition();
这里的pos是用来记录链表头的位置。
2.GetNext(POSITION pos);
用来获取下一个链表的位置。
返回值类型:与模板类里的参数2的类型一致。
例2:while(pos!=NULL)
{
Circle * cir = pDoc-m_CirList.GetNext(pos);
}
例2的作用,主要是遍历整个链表,从而对链表里的元素进行操作。因GetNext()返回值类型与链表里元素的类型一致, 故在此用Circle *类型的对象cir来对该链表中的元素进行操作。
在例1中提到,pos的作用是为了记录位置。 所以,while(pos!=NULL)的pos是用来判断pos是不是为空(亦可以理解为是否该链表没有元素, 或者已遍历到了尾部。)
如果pos不为空,则进入循环体,进行GetNext(pos)方法的操作。
:Circle * cir = pDoc-m_CirList.GetNext(pos); 这个是把链表里 当前位置(也就是pos)的元素赋给cir,然后pos的值变为下一个。如while(pos!=NULL)里的pos已为链表尾部, 则该值将变为Cx000000(也就是0),则跳出该循环。如不为链表的尾部,则pos的值将变为下一个位置。
注:GetPrev()的用法与GetNext()用法一致, 区别是从头到尾和从尾到头。
3.GetAt(pos)
用来获取当前位置里面的元素。
返回值类型:与模板类里的参数2的类型一致。
例3:Circle * Ncir=pDoc-m_CirList.GetAt(pos);
GetAt()的作用与GetNext()的作用类似,把链表里 当前位置(也就是pos)的元素赋给Ncir,注意:此时参数pos的值不变,也就是GetAt()与GetNext()的差别。
4.GetHead()
返回列表(不能为空)的头元素GetTail()的用法与GetHead()基本一致。
返回列表(不能为空)的尾元素。
返回值类型:与模板类里的参数2的类型一致。
5.GetCount
返回列表中的元素数目 wsprintf(str,%d,m_CirList.GetCount());
pDC-TextOutA(20,100,str);
IsEmpty
测试列表是否为空(无元素)return 0;
}
多用于判断
PS: 还有一些成员函数,等待笔者去验证。未完待续~!
关于大作业的心得
关于序列化
为了解决应用程序中含有动态对象的序列化问题,必须在自己类里面重载Serialize函数,并且加上宏的序列化声明DECLARE_SERIAL()以及类的序列化实现宏IMPLEMENT_SERIAL()。
需要特别关注的是,类中必须有个一个无参的构造函数,并且继承Cobject,以及头文件”afxtempl.h”。
关于向量
笔者做过试验, 曾用向量做过,但是不知道什么原因导致序列化失败,最终以失败告终,笔者会进一步研究出序列化的内幕,以实现向量的序列化。
关于错误
更多的错误源于对CtypedPtrList模板类里面的成员函数的使用。
如在处理OnLButtonDown消息时,
Circle * cir = pDoc-m_CirList.GetNext(pos);
pDoc-pCir = pDoc-m_CirList.GetAt(pos);
笔者曾这么用过, 忽略了在GetNext(pos)之后pos将变成下一个位置,而在后面又使用了GetAt(pos)方法(其实经过GetNext(pos)之后,pos的值已经变了,并且pos是否存在是未知的), 导致一些不必要的麻烦。
void CMFCView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMFCDoc* pDoc = GetDocume
文档评论(0)