Cara: Membuat Koleksi Type-Brankas
Artikel ini menjelaskan cara membuat koleksi yang aman untuk jenis data Anda sendiri. Topik meliputi:
Pustaka Kelas Microsoft Foundation menyediakan koleksi jenis aman yang telah ditentukan sebelumnya berdasarkan templat C++. Karena merupakan templat, kelas-kelas ini membantu memberikan keamanan jenis dan kemudahan penggunaan tanpa pengecoran jenis dan pekerjaan tambahan lainnya yang terlibat dalam menggunakan kelas nontemplate untuk tujuan ini. Sampel MFC COLLECT menunjukkan penggunaan kelas koleksi berbasis templat dalam aplikasi MFC. Secara umum, gunakan kelas ini kapan saja Anda menulis kode koleksi baru.
Menggunakan Kelas Berbasis Templat untuk Jenis Brankas ty
Untuk menggunakan kelas berbasis templat
Mendeklarasikan variabel jenis kelas koleksi. Contohnya:
CList<int, int> m_intList;
Panggil fungsi anggota objek koleksi. Contohnya:
m_intList.AddTail(100); m_intList.RemoveAll();
Jika perlu, terapkan fungsi pembantu dan SerializeElements. Untuk informasi tentang menerapkan fungsi-fungsi ini, lihat Menerapkan Fungsi Pembantu.
Contoh ini menunjukkan deklarasi daftar bilangan bulat. Parameter pertama di langkah 1 adalah jenis data yang disimpan sebagai elemen daftar. Parameter kedua menentukan bagaimana data akan diteruskan ke dan dikembalikan dari fungsi anggota kelas koleksi, seperti Add
dan GetAt
.
Menerapkan Fungsi Pembantu
Kelas CArray
koleksi berbasis templat , , CList
dan CMap
menggunakan lima fungsi pembantu global yang dapat Anda sesuaikan sesuai kebutuhan untuk kelas koleksi turunan Anda. Untuk informasi tentang fungsi pembantu ini, lihat Pembantu Kelas Koleksi di Referensi MFC. Implementasi fungsi serialisasi diperlukan untuk sebagian besar penggunaan kelas koleksi berbasis templat.
Elemen Serialisasi
Kelas CArray
, CList
, dan CMap
memanggil SerializeElements
untuk menyimpan elemen koleksi ke atau membacanya dari arsip.
Implementasi default fungsi pembantu SerializeElements
melakukan penulisan bitwise dari objek ke arsip, atau bitwise yang dibaca dari arsip ke objek, tergantung pada apakah objek disimpan atau diambil dari arsip. Ambil alih SerializeElements
jika tindakan ini tidak sesuai.
Jika koleksi Anda menyimpan objek yang berasal dari CObject
dan Anda menggunakan IMPLEMENT_SERIAL
makro dalam implementasi kelas elemen koleksi, Anda dapat memanfaatkan fungsionalitas serialisasi bawaan CArchive
dan CObject
:
CArray< CPerson, CPerson& > personArray;
template <> void AFXAPI SerializeElements <CPerson>(CArchive& ar,
CPerson* pNewPersons, INT_PTR nCount)
{
for (int i = 0; i < nCount; i++, pNewPersons++)
{
// Serialize each CPerson object
pNewPersons->Serialize(ar);
}
}
Operator penyisipan yang kelebihan beban untuk CArchive
panggilan CObject::Serialize
(atau penimpaan fungsi tersebut) untuk setiap CPerson
objek.
Menggunakan Kelas Koleksi Nontemplate
MFC juga mendukung kelas koleksi yang diperkenalkan dengan MFC versi 1.0. Kelas-kelas ini tidak didasarkan pada templat. Mereka dapat digunakan untuk berisi data dari jenis CObject*
yang didukung , , UINT
, DWORD
dan CString
. Anda dapat menggunakan koleksi yang telah ditentukan sebelumnya ini (seperti CObList
) untuk menyimpan koleksi objek apa pun yang berasal dari CObject
. MFC juga menyediakan koleksi lain yang telah ditentukan sebelumnya untuk menampung jenis primitif seperti UINT
dan void pointer (void*
). Namun, secara umum, seringkali berguna untuk menentukan koleksi jenis aman Anda sendiri untuk menyimpan objek dari kelas yang lebih spesifik dan turunannya. Perhatikan bahwa melakukannya dengan kelas koleksi yang tidak didasarkan pada templat lebih berfungsi daripada menggunakan kelas berbasis templat.
Ada dua cara untuk membuat koleksi jenis aman dengan koleksi nontemplate:
Gunakan koleksi nontemplate, dengan pengecoran jenis jika perlu. Ini adalah pendekatan yang lebih mudah.
Berasal dari dan memperluas koleksi jenis aman nontemplate.
Untuk menggunakan koleksi nontemplate dengan pengecoran jenis
Gunakan salah satu kelas nontemplate, seperti
CWordArray
, secara langsung.Misalnya, Anda dapat membuat
CWordArray
dan menambahkan nilai 32-bit ke dalamnya, lalu mengambilnya. Tidak ada lagi yang bisa dilakukan. Anda hanya menggunakan fungsionalitas yang telah ditentukan sebelumnya.Anda juga dapat menggunakan koleksi yang telah ditentukan sebelumnya, seperti
CObList
, untuk menyimpan objek apa pun yang berasal dariCObject
. KoleksiCObList
didefinisikan untuk menahan pointer keCObject
. Saat Anda mengambil objek dari daftar, Anda mungkin harus mentransmisikan hasilnya ke jenis yang tepat karenaCObList
fungsi mengembalikan penunjuk keCObject
. Misalnya, jika Anda menyimpanCPerson
objek dalamCObList
koleksi, Anda harus mentransmisikan elemen yang diambil untuk menjadi penunjuk keCPerson
objek. Contoh berikut menggunakanCObList
koleksi untuk menyimpanCPerson
objek:CPerson* p1 = new CPerson(); CObList myList; myList.AddHead(p1); // No cast needed CPerson* p2 = (CPerson*)myList.GetHead();
Teknik menggunakan jenis koleksi dan casting yang telah ditentukan sebelumnya ini mungkin memadai untuk banyak kebutuhan koleksi Anda. Jika Anda memerlukan fungsionalitas lebih lanjut atau keamanan jenis lainnya, gunakan kelas berbasis templat, atau ikuti prosedur berikutnya.
Untuk memperoleh dan memperluas koleksi jenis aman nontemplate
Dapatkan kelas koleksi Anda sendiri dari salah satu kelas nontemplate yang telah ditentukan sebelumnya.
Saat Anda memperoleh kelas, Anda dapat menambahkan fungsi pembungkus jenis aman untuk menyediakan antarmuka yang aman untuk jenis ke fungsi yang ada.
Misalnya, jika Anda memperoleh daftar dari
CObList
untuk menyimpanCPerson
objek, Anda dapat menambahkan fungsi pembungkusAddHeadPerson
danGetHeadPerson
, seperti yang ditunjukkan di bawah ini.class CPersonList : public CObList { public: void AddHeadPerson(CPerson* person) { AddHead(person); } const CPerson* GetHeadPerson() { return (CPerson*)GetHead(); } };
Fungsi pembungkus ini menyediakan cara yang aman untuk menambahkan dan mengambil
CPerson
objek dari daftar turunan. Anda dapat melihat bahwa untukGetHeadPerson
fungsi, Anda hanya merangkum jenis casting.Anda juga dapat menambahkan fungsionalitas baru dengan menentukan fungsi baru yang memperluas kemampuan koleksi daripada hanya membungkus fungsionalitas yang ada dalam pembungkus jenis aman. Misalnya, artikel Menghapus Semua Objek dalam Koleksi CObject menjelaskan fungsi untuk menghapus semua objek yang terkandung dalam daftar. Fungsi ini dapat ditambahkan ke kelas turunan sebagai fungsi anggota.