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 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 tipe dan kemudahan penggunaan tanpa pengubahan tipe dan upaya 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 Template-Based untuk Keamanan Tipe
Untuk menggunakan kelas berbasis templat
Deklarasikan sebuah variabel dari tipe kelas koleksi. Contohnya:
CList<int, int> m_intList;
Panggil fungsi-fungsi anggota dari 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 dari fungsi pembantu SerializeElements
melakukan penulisan bitwise dari objek ke arsip, atau pembacaan bitwise dari arsip ke objek, tergantung pada apakah objek sedang disimpan atau sedang 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 terlewatkan untuk CArchive
memanggil CObject::Serialize
(atau penimpaan fungsi tersebut) untuk setiap objek CPerson
.
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. Harap dicatat bahwa menggunakan kelas koleksi yang tidak didasarkan pada templat memerlukan lebih banyak usaha dibandingkan dengan menggunakan kelas berbasis templat.
Ada dua cara untuk membuat koleksi yang aman tipe dengan menggunakan koleksi nontemplate.
Gunakan koleksi tanpa template, dengan konversi tipe jika perlu. Ini adalah pendekatan yang lebih mudah.
Berasal dari dan memperluas koleksi tipe aman yang bukan template.
Untuk menggunakan koleksi nontemplate dengan konversi tipe
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 mengubah tipe hasilnya ke jenis yang tepat karena fungsiCObList
mengembalikan penunjuk keCObject
. Misalnya, jika Anda menyimpanCPerson
objek dalam koleksiCObList
, Anda harus mengubah tipe elemen yang diambil menjadi penunjuk ke objekCPerson
. 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 mengembangkan dan memperluas koleksi yang aman dengan tipe tanpa template
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 untuk fungsiGetHeadPerson
, Anda hanya merangkum konversi tipe.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.