存取集合中的所有成員
MFC 陣列集合類別,兩者以範本為基礎,並不 — 使用索引來存取其項目。MFC 清單和對應集合類別,兩者皆以範本為基礎,並不 — 使用的型別指標位置來描述集合中的指定之位置。若要存取這些集合的一或多個成員,您第一次初始化位置指示器,然後重複傳遞至集合的該位置並要求傳回下一個項目。集合並不負責維護反覆項目有關進度的狀態資訊。該資訊是存放在位置指示器。不過,根據所給的特定位置,集合是負責傳回下一個項目。
下列程序會示範如何反覆查看隨 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物件。對於具型別的指標的集合類別 — 陣列或 list — 第一個參數指定的基底類別。 第二個參數會指定要儲存的型別。
CTypedPtrArray類別也多載 運算子,讓您可以使用自訂的陣列註標語法來存取陣列元素。另一個方法的主體中的陳述式是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物件。當您使用 access 的功能,例如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 集合中刪除所有物件。