Kelas Berbasis Templat
Artikel ini menjelaskan kelas koleksi berbasis templat jenis aman di MFC versi 3.0 dan yang lebih baru. Menggunakan templat ini untuk membuat koleksi jenis aman lebih nyaman dan membantu memberikan keamanan jenis lebih efektif daripada menggunakan kelas koleksi yang tidak didasarkan pada templat.
MFC telah menentukan dua kategori koleksi berbasis templat:
Kelas array, daftar, dan peta sederhana
CArray
,CList
,CMap
Array, daftar, dan peta penunjuk yang dititik
CTypedPtrArray
,CTypedPtrList
,CTypedPtrMap
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 menggunakan panggilan yang dienkapsulasi ke anggota kelas dasar untuk memberlakukan keamanan jenis.
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
, ,char
danfloat
Struktur 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, memetakan kunci dan nilai terkait: Anda mengakses nilai yang disimpan dalam peta dengan menentukan kunci terkait nilai. 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 penunjuk 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.
Array Typed-Pointer dan Penggunaan Daftar
Array typed-pointer dan kelas daftar, 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. Untuk array, gunakan atau CObArray
CPtrArray
. Untuk daftar, gunakan atau CObList
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 typed-pointer, myArray
, 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 apa punCObArray
, atau Anda dapat memanggil jenis baru aman GetAt
dan ElementAt
fungsi 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
, , CMapStringToPtr
CMapPtrToPtr
, CMapWordToPtr
, 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 — menggunakan CString
kunci yang dipetakan CMapPtrToPtr
ke penunjuk ke MY_STRUCT
. Anda dapat mencari penunjuk tersimpan dengan memanggil fungsi anggota jenis aman 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 CMapPtrToPtr
lainnya .
Contoh kedua adalah peta berdasarkan — menggunakan kunci string yang dipetakan CMapStringToOb
ke pointer tersimpan ke CMyObject
objek. Anda dapat menggunakan anggota jenis aman yang sama yang dijelaskan dalam paragraf sebelumnya, atau Anda dapat memanggil anggota kelas CMapStringToOb
.
Catatan
Jika Anda menentukan class
atau struct
mengetik untuk parameter VALUE , bukan penunjuk atau referensi ke jenis, kelas atau struktur harus memiliki konstruktor salinan.
Untuk informasi selengkapnya, lihat Cara Membuat Koleksi Type-Brankas.