存取集合的所有成員
MFC 陣列集合類別 (範本型和非範本型) 使用索引來存取其項目。 MFC 清單和對應集合類別 (範本型和非範本型) 使用 POSITION 類型的指標來描述集合中的指定位置。 若要存取這些集合的一或多個成員,請先將位置指標初始化,然後將該位置重複傳遞給集合,並要求它傳回下一個項目。 集合不負責維護反覆項目進度的相關狀態資訊。 該資訊會保留在位置指示器中。 但若指定特定位置,集合會負責傳回下一個元素。
下列程序示範如何逐一查看隨 MFC 提供的三種主要集合類型︰
逐一查看陣列
使用循序索引編號並搭配
GetAt
成員函式︰CTypedPtrArray<CObArray, CPerson *> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize(); i++) { CPerson *thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
此範例使用具類型的指標陣列,其中包含
CPerson
物件的指標。 此陣列衍生自類別CObArray
,這是其中一個預先定義的非範本類別。GetAt
傳回CPerson
物件的指標。 針對具類型的指標集合類別 (陣列或清單),第一個參數會指定基底類別,第二個參數會指定要儲存的類型。類別
CTypedPtrArray
也會多載 [ ] 運算子,讓您可以使用自訂的 array-subscript 語法來存取陣列的專案。 上述for
迴圈主體中的陳述式可替代成CPerson *thePerson = myArray[i];
此運算子同時
const
存在於 和非const
版本中。 針對const
陣列叫const
用的版本只能出現在指派語句的右側。
逐一查看清單
使用成員函式
GetHeadPosition
和GetNext
來執行清單︰CTypedPtrList<CObList, CPerson *> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while (pos != NULL) { CPerson *thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
此範例使用具類型的指標清單來包含
CPerson
物件的指標。 此清單宣告類似於 逐一查看陣列 程序中對陣列所做的宣告,但衍生自類別CObList
。GetNext
傳回CPerson
物件的指標。
逐一查看對應
使用
GetStartPosition
移至對應的開頭,並使用GetNextAssoc
重複取得對應中的下一組索引鍵和值,如下列範例所示︰CMap<CString, LPCTSTR, CPerson *, CPerson *> myMap; CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while (pos != NULL) { CPerson *pPerson; CString string; // Get key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPerson); // Use string and pPerson }
此範例使用簡單的對應範本 (而不是具類型的指標集合),該範本使用
CString
索引鍵,並將指標儲存至CPerson
物件。 當您使用GetNextAssoc
等存取函式時,該類別會提供CPerson
物件的指標。 如果您改用其中一個非範本對應集合,您必須將傳回的CObject
指標轉換成CPerson
的指標。注意
若是非範本對應,編譯器需要參考傳遞給
CObject
之最後一個參數中的GetNextAssoc
指標。 輸入時,您必須將指標轉換成該類型,如下一個範例所示。此範本解決方案比較簡單,並可協助改善型別安全。 非範本程式碼則比較複雜,如下所示︰
CMapStringToOb myMap; // A nontemplate collection class CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while (pos != NULL) { CPerson *pPerson; CString string; // Gets key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, (CObject *&)pPerson); ASSERT(pPerson->IsKindOf(RUNTIME_CLASS(CPerson))); // Use string and pPerson ... }
如需詳細資訊,請參閱 刪除 CObject 集合中的所有物件。