Bagikan melalui


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

  1. Mendeklarasikan variabel jenis kelas koleksi. Contohnya:

    CList<int, int> m_intList;
    
  2. Panggil fungsi anggota objek koleksi. Contohnya:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. 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 CArraykoleksi berbasis templat , , CListdan 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, DWORDdan 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:

  1. Gunakan koleksi nontemplate, dengan pengecoran jenis jika perlu. Ini adalah pendekatan yang lebih mudah.

  2. Berasal dari dan memperluas koleksi jenis aman nontemplate.

Untuk menggunakan koleksi nontemplate dengan pengecoran jenis

  1. 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 dari CObject. Koleksi CObList didefinisikan untuk menahan pointer ke CObject. Saat Anda mengambil objek dari daftar, Anda mungkin harus mentransmisikan hasilnya ke jenis yang tepat karena CObList fungsi mengembalikan penunjuk ke CObject. Misalnya, jika Anda menyimpan CPerson objek dalam CObList koleksi, Anda harus mentransmisikan elemen yang diambil untuk menjadi penunjuk ke CPerson objek. Contoh berikut menggunakan CObList koleksi untuk menyimpan CPerson 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

  1. 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 menyimpan CPerson objek, Anda dapat menambahkan fungsi pembungkus AddHeadPerson dan GetHeadPerson, 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 GetHeadPerson 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.

Baca juga

Koleksi