Mengakses Semua Anggota Koleksi
Kelas koleksi array MFC — berbasis templat dan tidak — gunakan indeks untuk mengakses elemennya. Daftar MFC dan kelas pengumpulan peta — baik berbasis templat maupun tidak — gunakan indikator jenis POSISI untuk menjelaskan posisi tertentu dalam koleksi. Untuk mengakses satu atau beberapa anggota koleksi ini, Anda terlebih dahulu menginisialisasi indikator posisi dan kemudian berulang kali meneruskan posisi tersebut ke koleksi dan memintanya untuk mengembalikan elemen berikutnya. Koleksi tidak bertanggung jawab untuk mempertahankan informasi status tentang kemajuan iterasi. Informasi tersebut disimpan dalam indikator posisi. Tetapi, mengingat posisi tertentu, koleksi bertanggung jawab untuk mengembalikan elemen berikutnya.
Prosedur berikut menunjukkan cara melakukan iterasi atas tiga jenis koleksi utama yang disediakan dengan MFC:
Untuk melakukan iterasi array
Gunakan nomor indeks berurutan dengan
GetAt
fungsi anggota:CTypedPtrArray<CObArray, CPerson *> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize(); i++) { CPerson *thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
Contoh ini menggunakan array penunjuk yang diketik yang berisi pointer ke
CPerson
objek. Array berasal dari kelasCObArray
, salah satu kelas nontemplate yang telah ditentukan sebelumnya.GetAt
mengembalikan penunjuk keCPerson
objek. Untuk kelas koleksi pointer yang ditik — array atau daftar — parameter pertama menentukan kelas dasar; parameter kedua menentukan jenis yang akan disimpan.Kelas ini
CTypedPtrArray
juga membebani operator [ ] sehingga Anda dapat menggunakan sintaks array-subscript kustom untuk mengakses elemen array. Alternatif untuk pernyataan dalam isifor
perulangan di atas adalahCPerson *thePerson = myArray[i];
Operator ini ada dalam versi dan
const
non-versiconst
. Versiconst
, yang dipanggil untukconst
array, hanya dapat muncul di sisi kanan pernyataan penugasan.
Untuk melakukan iterasi daftar
Gunakan fungsi
GetHeadPosition
anggota danGetNext
untuk bekerja dengan cara Anda melalui daftar:CTypedPtrList<CObList, CPerson *> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while (pos != NULL) { CPerson *thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
Contoh ini menggunakan daftar penunjuk yang ditik untuk berisi penunjuk ke
CPerson
objek. Deklarasi daftar menyerupkan array dalam prosedur Untuk melakukan iterasi array tetapi berasal dari kelasCObList
.GetNext
mengembalikan penunjuk keCPerson
objek.
Untuk melakukan iterasi peta
Gunakan
GetStartPosition
untuk sampai ke awal peta danGetNextAssoc
untuk berulang kali mendapatkan kunci dan nilai berikutnya dari peta, seperti yang ditunjukkan oleh contoh berikut: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 }
Contoh ini menggunakan templat peta sederhana (bukan koleksi pointer yang ditik) yang menggunakan
CString
kunci dan menyimpan pointer keCPerson
objek. Saat Anda menggunakan fungsi akses sepertiGetNextAssoc
, kelas menyediakan penunjuk keCPerson
objek. Jika Anda menggunakan salah satu koleksi peta nontemplate sebagai gantinya, Anda harus mentransmisikan penunjuk yang dikembalikanCObject
ke penunjuk keCPerson
.Catatan
Untuk peta nontemplate, pengkompilasi memerlukan referensi ke
CObject
penunjuk di parameter terakhir keGetNextAssoc
. Pada input, Anda harus melemparkan pointer Anda ke jenis tersebut, seperti yang ditunjukkan dalam contoh berikutnya.Solusi templat lebih sederhana dan membantu memberikan keamanan jenis yang lebih baik. Kode nontemplate lebih rumit, seperti yang Anda lihat di sini:
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 ... }
Untuk informasi selengkapnya, lihat Menghapus Semua Objek dalam Koleksi CObject.