Rumah > pembangunan bahagian belakang > C++ > Mengapa saya tidak boleh menggunakan kelas dengan pembina bukan remeh dalam kesatuan C?

Mengapa saya tidak boleh menggunakan kelas dengan pembina bukan remeh dalam kesatuan C?

Mary-Kate Olsen
Lepaskan: 2024-11-19 17:19:03
asal
1007 orang telah melayarinya

Why can't I use classes with non-trivial constructors in C   unions?

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;
};
Salin selepas log masuk

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;  // <--
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan