Apa gunanya memiliki destructor sebagai pribadi?
sumber
Pada dasarnya, setiap kali Anda ingin beberapa kelas lain bertanggung jawab atas siklus hidup objek kelas Anda, atau Anda memiliki alasan untuk mencegah penghancuran suatu objek, Anda dapat menjadikan destruktor itu pribadi.
Misalnya, jika Anda melakukan semacam penghitungan referensi, Anda dapat memiliki objek (atau pengelola yang "teman" red) yang bertanggung jawab untuk menghitung jumlah referensi itu sendiri dan menghapusnya ketika jumlahnya mencapai nol. Seorang dtor pribadi akan mencegah orang lain menghapusnya ketika masih ada referensi untuk itu.
Untuk contoh lain, bagaimana jika Anda memiliki objek yang memiliki manajer (atau dirinya sendiri) yang dapat menghancurkannya atau mungkin menolak untuk menghancurkannya tergantung pada kondisi lain dalam program, seperti koneksi database yang terbuka atau file yang sedang ditulis. Anda bisa memiliki metode "request_delete" di kelas atau manajer yang akan memeriksa kondisi itu dan itu akan menghapus atau menolak, dan mengembalikan status yang memberi tahu Anda apa yang telah dilakukannya. Itu jauh lebih fleksibel daripada hanya memanggil "hapus".
Objek seperti itu tidak pernah dapat dibuat di stack. Selalu di tumpukan. Dan penghapusan harus dilakukan melalui teman atau anggota. Suatu produk dapat menggunakan hierarki objek tunggal dan manajer memori khusus - skenario tersebut dapat menggunakan dtor pribadi.
#include <iostream>
class a {
~a() {}
friend void delete_a(a* p);
};
void delete_a(a* p) {
delete p;
}
int main()
{
a *p = new a;
delete_a(p);
return 0;
}
Ketika Anda tidak ingin pengguna mengakses destruktor, yaitu, Anda ingin objek hanya dihancurkan melalui cara lain.
http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx memberikan contoh, di mana referensi objek dihitung dan hanya boleh dimusnahkan oleh objek itu sendiri ketika hitungannya menjadi nol.
sumber
COM menggunakan strategi ini untuk menghapus instance. COM menjadikan destructor sebagai pribadi dan menyediakan antarmuka untuk menghapus instance.
Berikut ini adalah contoh dari bagaimana metode Release akan terlihat.
Objek ATL COM adalah contoh utama dari pola ini.
sumber
Menambah jawaban sudah ada di sini; konstruktor dan destruktor pribadi cukup berguna saat menerapkan pabrik di mana objek yang dibuat harus dialokasikan pada heap. Objek akan, secara umum, dibuat / dihapus oleh anggota statis atau teman. Contoh penggunaan tipikal:
sumber
Kelas hanya dapat dihapus dengan sendirinya. Berguna jika Anda membuat beberapa percobaan referensi objek yang dihitung. Maka hanya metode pelepasan yang dapat menghapus objek, mungkin membantu Anda menghindari kesalahan.
sumber
Saya tahu Anda bertanya tentang destruktor pribadi. Inilah cara saya menggunakan yang dilindungi. Idenya adalah Anda tidak ingin menghapus kelas utama melalui pointer ke kelas yang menambahkan fungsionalitas tambahan ke utama.
Dalam contoh di bawah ini saya tidak ingin GuiWindow dihapus melalui pointer HandlerHolder.
sumber
dirkgently salah. Berikut adalah contoh objek dengan private c-tor dan d-tor yang dibuat pada stack (Saya menggunakan fungsi anggota statis di sini, tetapi dapat dilakukan dengan fungsi teman atau kelas teman juga).
Kode ini akan menghasilkan keluaran: di dalam PrivateCD :: TryMe, p._i = 8
sumber
Mungkin cara untuk mengatasi masalah di Windows di mana setiap modul dapat menggunakan tumpukan yang berbeda, seperti tumpukan Debug . Jika masalah itu tidak ditangani dengan benar, hal - hal buruk dapat terjadi.
sumber