Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan kelas koleksi berbasis templat type-safe di MFC versi 3.0 dan yang lebih baru. Menggunakan templat ini untuk membuat koleksi yang aman tipe lebih nyaman dan lebih efektif dalam memberikan keamanan tipe dibandingkan menggunakan kelas koleksi yang tidak berbasis templat.
MFC telah menentukan dua kategori koleksi berbasis templat:
Kelas array, daftar, dan pemetaan sederhana
CArray, ,CListCMapArray, daftar, dan peta penunjuk yang dititik
CTypedPtrArray, ,CTypedPtrListCTypedPtrMap
Kelas koleksi sederhana semuanya berasal dari kelas CObject, sehingga mewarisi serialisasi, pembuatan dinamis, dan properti lainnya dari CObject. Kelas koleksi pointer yang ditik mengharuskan Anda menentukan kelas yang Anda dapatkan — yang harus menjadi salah satu koleksi pointer nontemplate yang telah ditentukan oleh MFC, seperti CPtrList atau CPtrArray. Kelas koleksi baru Anda mewarisi dari kelas dasar yang ditentukan, dan fungsi anggota kelas baru memanfaatkan pemanggilan yang dienkapsulasi ke anggota kelas dasar untuk memberlakukan keamanan tipe data.
Untuk informasi selengkapnya tentang templat C++, lihat Templat di Referensi Bahasa C++.
Menggunakan Array Sederhana, Daftar, dan Templat Peta
Untuk menggunakan templat koleksi sederhana, Anda perlu mengetahui jenis data apa yang dapat Anda simpan dalam koleksi ini dan parameter apa yang akan digunakan dalam deklarasi koleksi Anda.
Penggunaan Array dan Daftar Sederhana
Array sederhana dan daftar kelas, CArray dan CList, mengambil dua parameter: TYPE dan ARG_TYPE. Kelas-kelas ini dapat menyimpan jenis data apa pun, yang Anda tentukan dalam parameter TYPE :
Jenis data C++ dasar, seperti
int, ,chardanfloatStruktur dan kelas C++
Jenis lain yang Anda tentukan
Untuk kenyamanan dan efisiensi, Anda dapat menggunakan parameter ARG_TYPE untuk menentukan jenis argumen fungsi. Biasanya, Anda menentukan ARG_TYPE sebagai referensi ke jenis yang Anda beri nama dalam parameter TYPE . Contohnya:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
Contoh pertama mendeklarasikan koleksi array, myArray, yang berisi **int**s. Contoh kedua mendeklarasikan kumpulan daftar, myList, yang menyimpan CPerson objek. Fungsi anggota tertentu dari kelas koleksi mengambil argumen yang jenisnya ditentukan oleh parameter templat ARG_TYPE . Misalnya, Add fungsi anggota kelas CArray mengambil argumen ARG_TYPE :
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
Penggunaan Peta Sederhana
Kelas peta sederhana, CMap, mengambil empat parameter: KEY, ARG_KEY, VALUE, dan ARG_VALUE. Seperti kelas array dan daftar, kelas peta dapat menyimpan jenis data apa pun. Tidak seperti array dan daftar, yang mengindeks dan mengurutkan data yang disimpan, map memetakan kunci dan nilai: Anda mengakses nilai yang disimpan dalam map dengan menentukan kunci yang terkait dengan nilai tersebut. Parameter KEY menentukan jenis data kunci yang digunakan untuk mengakses data yang disimpan di peta. Jika jenis KEY adalah struktur atau kelas, parameter ARG_KEY biasanya merupakan referensi ke jenis yang ditentukan dalam KEY. Parameter VALUE menentukan jenis item yang disimpan di peta. Jika jenis ARG_VALUE adalah struktur atau kelas, parameter ARG_VALUE biasanya merupakan referensi ke jenis yang ditentukan dalam VALUE. Contohnya:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
Contoh pertama menyimpan MY_STRUCT nilai, mengaksesnya berdasarkan int kunci, dan mengembalikan item yang MY_STRUCT diakses berdasarkan referensi. Contoh kedua menyimpan CPerson nilai, mengaksesnya berdasarkan CString kunci, dan mengembalikan referensi ke item yang diakses. Contoh ini mungkin mewakili buku alamat sederhana, di mana Anda mencari orang dengan nama belakang.
Karena parameter KEY berjenis CString dan parameter KEY_TYPE berjenis LPCSTR, kunci disimpan dalam peta sebagai item jenis CString tetapi dirujuk dalam fungsi seperti SetAt melalui pointer jenis LPCSTR. Contohnya:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Menggunakan Templat Koleksi Typed-Pointer
Untuk menggunakan templat koleksi pointer yang diketik, Anda perlu mengetahui jenis data apa yang dapat Anda simpan dalam koleksi ini dan parameter apa yang akan digunakan dalam deklarasi koleksi Anda.
Typed-Pointer Penggunaan Array dan Daftar
Array penunjuk bertipe dan kelas daftar bertipe, CTypedPtrArray dan CTypedPtrList, mengambil dua parameter: BASE_CLASS dan TYPE. Kelas-kelas ini dapat menyimpan jenis data apa pun, yang Anda tentukan dalam parameter TYPE . Mereka berasal dari salah satu kelas koleksi nontemplate yang menyimpan pointer; Anda menentukan kelas dasar ini di BASE_CLASS. Gunakan salah satu dari CObArray atau CPtrArray untuk array. Untuk daftar, gunakan salah satu CObList atau CPtrList.
Akibatnya, ketika Anda mendeklarasikan koleksi berdasarkan, katakanlah CObList, kelas baru tidak hanya mewarisi anggota kelas dasarnya, tetapi juga mendeklarasikan sejumlah fungsi dan operator anggota tipe aman tambahan yang membantu memberikan keamanan jenis dengan merangkum panggilan ke anggota kelas dasar. Enkapsulasi ini mengelola semua konversi jenis yang diperlukan. Contohnya:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
Contoh pertama mendeklarasikan array penunjuk bertipe, myArray, yang berasal dari CObArray. Array menyimpan dan mengembalikan pointer ke CPerson objek (di mana CPerson adalah kelas yang berasal dari CObject). Anda dapat memanggil fungsi anggota mana pun CObArray, atau Anda dapat memanggil fungsi jenis aman baru GetAt dan ElementAt atau menggunakan operator [ ] jenis aman.
Contoh kedua mendeklarasikan daftar penunjuk yang diketik, myList, berasal dari CPtrList. Daftar menyimpan dan mengembalikan penunjuk ke MY_STRUCT objek. Kelas berdasarkan CPtrList digunakan untuk menyimpan pointer ke objek yang tidak berasal dari CObject.
CTypedPtrList memiliki sejumlah fungsi anggota jenis aman: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev, dan GetAt.
Penggunaan Peta Typed-Pointer
Kelas peta typed-pointer, CTypedPtrMap, mengambil tiga parameter: BASE_CLASS, KEY, dan VALUE. Parameter BASE_CLASS menentukan kelas untuk memperoleh kelas baru: CMapPtrToWord, , CMapPtrToPtr, CMapStringToPtrCMapWordToPtr, CMapStringToOb, dan sebagainya.
KEY dianalogikan dengan KEY di CMap: Ini menentukan jenis kunci yang digunakan untuk pencarian.
VALUE dianalogikan dengan VALUE di CMap: Ini menentukan jenis objek yang disimpan dalam peta. Contohnya:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
Contoh pertama adalah peta berdasarkan CMapPtrToPtr — menggunakan kunci CString yang dipetakan ke penunjuk ke MY_STRUCT. Anda dapat mencari penunjuk tersimpan dengan memanggil anggota fungsi aman tipe Lookup. Anda dapat menggunakan operator [ ] untuk mencari penunjuk tersimpan dan menambahkannya jika tidak ditemukan. Dan Anda dapat melakukan iterasi peta menggunakan fungsi type-safe GetNextAssoc . Anda juga dapat memanggil fungsi anggota kelas CMapPtrToPtrlainnya .
Contoh kedua adalah peta yang berdasarkan pada CMapStringToOb — menggunakan kunci string yang dipetakan ke pointer tersimpan untuk objek CMyObject. Anda dapat menggunakan anggota jenis aman yang sama yang dijelaskan dalam paragraf sebelumnya, atau Anda dapat memanggil anggota kelas CMapStringToOb.
Nota
Jika Anda menentukan tipe class atau struct untuk parameter VALUE, bukan sebagai penunjuk atau referensi ke tipe tersebut, kelas atau struktur tersebut harus memiliki konstruktor salinan.
Untuk informasi selengkapnya, lihat Cara Membuat Koleksi Type-Safe.