C 11, hala yaşamaya değer olduğunu açıkça silinmiş üye fonksiyonları noncopyable temel sınıfından miras ile?
C 11, hala yaşamaya değer olduğunu açıkça silinmiş üye fonksiyonları noncopyable temel sınıfından miras ile?
Size özel veya silinmiş bir kopya Kurucu ve kopya atama (*18 örneğin*) özel olan bir temel sınıf devralır nerede hile bahsediyorum.
Avantajları ileri question Bu koy hala C 11 için uygulanabilir mi?
Bazı insanlar kolay olmayan copyable C 11 sınıfı yapmak olduğunu söylerler anlamıyorum.
C 03:
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
C 11:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
DÜZENLEME:
Birçok kişi çekti, bu bir hataydı sağlamak boş organları (yani {}) için özel bir kopya Kurucu ve kopya atama operatör, çünkü bu izin sınıfı kendisini çağırmak bu operatörlerin hataları. Ben ilk eklemekten başladı {} Ama beni Ekle yapılan bazı linker sorunları koştu {} (şartlar hatırlıyorum bilmiyorum) saçma bir nedenle. Daha iyi olduğunu biliyorum. :-)
CEVAP
Bu:
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
Teknik olarak hala MyClass
üyeleri ve arkadaşlar tarafından kopyalanmasına izin verir. Tabii, bu tür ve işlevleri teorik olarak kontrol altında, ama sınıf halacopyable. En az boost::noncopyable
= delete
ilehiç kimsesınıf kopyalayabilirsiniz.
Bazı insanlar kolay olmayan copyable C 11 sınıfı yapmak olduğunu söylerler anlamıyorum.
O kadar da önemli değil "" "daha kolay". sindirilebilir olarak daha kolay
Bu göz önünde bulundurun:
class MyClass
{
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
};
Eğer C üzerinde bir tanıtım metni okudu , ama C (örn: bir . deyimsel az maruz olan bir C programcısı iseniz ^em>çokC programcıları), bu... kafa karıştırıcı. Kopya kurucular bildirir ve atama operatörleri kopya, ama içleri boş. Neden hepsini beyan? Evet, private
, ama bu sadece yükseltirdaha fazlaözel neden? soru:
Bu kopya engeller neden anlamak için, onları özel bildirerek, üye olmayan arkadaş/kopya olamaz, bunu yapmak o kadar fark var. Bu hemen acemi için açık değildir. Ne kopyalamak çalıştığınızda alırsınız bu hata iletisidir.
Şimdi, C 11 sürümü ile karşılaştır:
class MyClass
{
public:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
};
Bu sınıf kopyalanamaz anlamak için ne gerekir? = delete
sözdizimi ne anlama geldiğini anlamak başka bir şey. Herhangi bir kitap C 11 sözdizimi kuralları açıklayan tam olarak ne yaptığını söyleyecektir. Bu kodun etkisi deneyimsiz C kullanıcı için açıktır.
Bu deyim hakkında harika ne demek istediğini söylemek en net, en belirgin şekilde, çünkü bir deyim olur.
Hatta boost::noncopyable
biraz daha fazla düşünce gerektirir. Evet, bunun adı "kendi kendine tanım.", noncopyable Ama eğer daha önce gördüysen, sorulara sebep oluyor. Neden kopyalanabilir mi bir şey türetmek misin? Neden boost::noncopyable
hata iletileri hakkında konuşmam'ler kopya kurucu? Vb. Yine, dilini anlamak, daha fazla zihinsel çaba gerektirir.
Açıkça temel sanal yıkıcı aramam gerek...
git remote şube silinmiş ama hala ...
Neden değer Ot kurucu üye fonksiyonlar...
Devre dışı bırak onay formu alan ama h...
Visual Studio: Nasıl tüm sınıflar teme...