SORU
27 ŞUBAT 2012, PAZARTESİ


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
27 ŞUBAT 2012, PAZARTESİ


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::noncopyablehata iletileri hakkında konuşmam'ler kopya kurucu? Vb. Yine, dilini anlamak, daha fazla zihinsel çaba gerektirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • Madeon

    Madeon

    31 Ocak 2010
  • NPR

    NPR

    22 NİSAN 2006