正在加载图片...
第12单元文档/视图结构 246 STringer 动态可扩展 CString对象数组 CObList CObject指针双向链表 CPtrlist void指针双向链表 CStringlist CString指针双向链表 CMapString Toob 以 CString对象为关键字的 CObject指针映射 下面以 COblist为例说明非基于模板集合类的使用方法。对于链表类来说,主要操作有 加入元素、删除元素和访问元素(遍历链表)等。注意 CObList类的元素是 CObject类的指 针而不是 CObject类的对象( CObArray类和 CMap String ToOb类也是如此) 向链表中插入元素可从表头或表尾进行。在插入元素时,首先要用new生成一个对象, 然后将其指针存入链表。例如 CRect*pBubble= new CRect (point x-r, point. y-r, point x+r, point y+r) m list Bubble AddHead(( CObject *)pBubble); 要访问链表的成员,可以使用链表类的成员函数 Get headPosition()取到链表头地址, 然后使用 GetNext()函数逐个取得链表元素(指向 CObject类的指针)。这两个成员函数的 原型为 POSITION GetHead Position()const; CObject*GetNext( POSITIoN& rPosition )const 其中POSI∏ON类型的变量用于存放链表元素的地址,空值NULL表示已指向表尾。例如 POSition pos=m listBubble GetHead Position( while( pos I= NULL CRect *bUbble=( CRect*)m list Bubble GetNext( pos) pDC->Ellipse(bUbble) 要删除链表的成员,仍可利用成员函数 GetHead Position()和 GetNext()来遍历链表 并用 delete逐个删除表中元素(指针)指向的 CObject派生类的对象,最后调用链表类的成 员函数 RemoveAll()删除链表中包含的所有指针元素。由于链表中只存储了一些指向 CObject类的指针,如果只是简单地使用成员函数 RemoveAll()删除链表元素,则这些指 针元素所指向的、动态生成的 CObject派生类对象所占用的存储空间并没有释放。更糟糕的 是,由于指向它们的指针(链表元素)已被删除,以后再想释放这些对象占用的存储空间也 不可能了。因此,清理链表的正确方法是: POSition pos =m listBubble Get Head Position while( pos I= NULL CRect *pBubble=( CRect *)m list Bubble. Get Next(pos);第 12 单元 文档/视图结构 - 246 - CStringArray 动态可扩展 CString 对象数组 CObList CObject 指针双向链表 CPtrList void 指针双向链表 CStringList CString 指针双向链表 CMapStringToOb 以 CString 对象为关键字的 CObject 指针映射 下面以 CObList 为例说明非基于模板集合类的使用方法。对于链表类来说,主要操作有 加入元素、删除元素和访问元素(遍历链表)等。注意 CObList 类的元素是 CObject 类的指 针而不是 CObject 类的对象(CObArray 类和 CMapStringToOb 类也是如此)。 向链表中插入元素可从表头或表尾进行。在插入元素时,首先要用 new 生成一个对象, 然后将其指针存入链表。例如 CRect *pBubble = new CRect (point.x−r, point.y−r, point.x+r, point.y+r); m_listBubble.AddHead ((CObject *)pBubble); 要访问链表的成员,可以使用链表类的成员函数 GetHeadPosition()取到链表头地址, 然后使用 GetNext()函数逐个取得链表元素(指向 CObject 类的指针)。这两个成员函数的 原型为: POSITION GetHeadPosition( ) const; CObject* GetNext( POSITION& rPosition ) const; 其中 POSITION 类型的变量用于存放链表元素的地址,空值 NULL 表示已指向表尾。例如 POSITION pos = m_listBubble.GetHeadPosition( ); while(pos != NULL) { CRect *pBubble = (CRect *)m_listBubble.GetNext(pos); pDC->Ellipse(pBubble); } 要删除链表的成员,仍可利用成员函数 GetHeadPosition()和 GetNext()来遍历链表 并用 delete 逐个删除表中元素(指针)指向的 CObject 派生类的对象,最后调用链表类的成 员函数 RemoveAll()删除链表中包含的所有指针元素。由于链表中只存储了一些指向 CObject 类的指针,如果只是简单地使用成员函数 RemoveAll()删除链表元素,则这些指 针元素所指向的、动态生成的 CObject 派生类对象所占用的存储空间并没有释放。更糟糕的 是,由于指向它们的指针(链表元素)已被删除,以后再想释放这些对象占用的存储空间也 不可能了。因此,清理链表的正确方法是: POSITION pos = m_listBubble.GetHeadPosition(); while(pos != NULL) { CRect *pBubble = (CRect *)m_listBubble.GetNext(pos); delete pBubble;
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有