Rumah >pembangunan bahagian belakang >C++ >Mengapa saya tidak boleh menggunakan kelas dengan pembina bukan remeh dalam kesatuan C?
Memahami Sekatan Kesatuan
Dalam C , kesatuan mewakili kawasan memori yang dikongsi oleh berbilang ahli data. Walau bagaimanapun, pengkompil mengehadkan penggunaan kelas dengan pembina bukan remeh, pembina salin atau pemusnah dalam kesatuan.
Masalahnya
Apabila cuba mengisytiharkan kesatuan dengan ahli rentetan, seperti yang ditunjukkan di bawah:
union U { int i; float f; string s; };
pengkompil menimbulkan ralat yang menunjukkan bahawa U::s mempunyai pembina salinan.
Mengapa Sekatan?
Sekatan ini wujud kerana mempunyai kelas dengan operasi bukan remeh dalam kesatuan memperkenalkan cabaran pengurusan memori. Dalam struct biasa, setiap ahli diperuntukkan memorinya sendiri. Walau bagaimanapun, dalam kesatuan, semua ahli berkongsi alamat memori yang sama.
Pertimbangkan contoh di bawah:
union U { string x; vector<int> y; }; U u; // <--
Jika anda adalah struct, u.x dan u.y akan dimulakan kepada rentetan kosong dan vektor, masing-masing. Walau bagaimanapun, dalam kesatuan, u.x dan u.y berkongsi alamat yang sama. Oleh itu, memulakan salah satu daripadanya akan menimpa data yang lain.
Alternatif: Kesatuan Bertanda dan Kebolehlanjutan
Untuk menangani isu ini, C 0x memperkenalkan "kesatuan bertanda. " Kesatuan ini membolehkan penggunaan pembolehubah ahli untuk menunjukkan ahli yang aktif, membolehkan pembinaan dan pemusnahan ahli kelas yang lebih fleksibel dalam kesatuan.
Sebagai alternatif, perpustakaan luaran seperti Boost.Variant dan Boost.Any menyediakan kefungsian yang serupa sambil merangkum kerumitan pengurusan memori.
Atas ialah kandungan terperinci Mengapa saya tidak boleh menggunakan kelas dengan pembina bukan remeh dalam kesatuan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!