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
Mary-Kate Olsenasal
2024-11-19 17:19:03988semak imbas

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;
};

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!

Kenyataan:
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