Bagikan melalui


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

  1. 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 kelas CObArray, salah satu kelas nontemplate yang telah ditentukan sebelumnya. GetAt mengembalikan penunjuk ke CPerson 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 isi for perulangan di atas adalah

    CPerson *thePerson = myArray[i];
    

    Operator ini ada dalam versi dan const non-versiconst . Versi const , yang dipanggil untuk const array, hanya dapat muncul di sisi kanan pernyataan penugasan.

Untuk melakukan iterasi daftar

  1. Gunakan fungsi GetHeadPosition anggota dan GetNext 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 kelas CObList. GetNext mengembalikan penunjuk ke CPerson objek.

Untuk melakukan iterasi peta

  1. Gunakan GetStartPosition untuk sampai ke awal peta dan GetNextAssoc 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 ke CPerson objek. Saat Anda menggunakan fungsi akses seperti GetNextAssoc, kelas menyediakan penunjuk ke CPerson objek. Jika Anda menggunakan salah satu koleksi peta nontemplate sebagai gantinya, Anda harus mentransmisikan penunjuk yang dikembalikan CObject ke penunjuk ke CPerson.

    Catatan

    Untuk peta nontemplate, pengkompilasi memerlukan referensi ke CObject penunjuk di parameter terakhir ke GetNextAssoc. 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.

Baca juga

Koleksi