Bagikan melalui


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 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, , chardan float

  • 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. CTypedPtrListmemiliki sejumlah fungsi anggota jenis aman: GetHead, , GetTail, RemoveHead, RemoveTailGetNext, 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, , CMapStringToPtrCMapPtrToPtr, CMapWordToPtr, CMapStringToObdan 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 CMapPtrToPtrlainnya .

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.

Baca juga

Koleksi