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
也會多載 [ ] 運算符,以便您可以使用慣用的陣列下標語法來存取陣列的元素。 上述迴圈主體中的語句可以替換為for
CPerson *thePerson = myArray[i];
此運算符存在於
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 集合中的所有物件。