2012-12-01 19 views
51

Yapıcımı ne zaman/neden açık bir şekilde silmek istiyorum? Nedeni kullanımını engellemek olduğu varsayılarak, neden sadece private?neden kurucuyu açıkça silinsin?

Teşekkürler!

//deleted constructor 
class Foo 
{ 
    public: 
    Foo() = delete;  
    public: 
    static void foo(); 
}; 

void Foo::foo() 
{ 
    Foo f; //illegal 
} 

//private constructor 
class Foo 
{ 
    private: 
    Foo() {}  
    public: 
    static void foo(); 
}; 

void Foo::foo() 
{ 
    Foo f; //legal 
} 

karşı Bunlar temelde farklı şeyler konum: nereden

+9

Bu, türünün bile kullanamayacağı bir şey olan '= default' ile uyumludur ve ben şahsen görmeyi tercih ederim * Silinen işlevlerin kullanımı * over * İşlev özeldir. * Önceki ifadesi açıkça belirtmektedir. kullanılacak olan." Eğer herhangi bir şey ortaya çıkarsa, onu kullanamayan sınıf aslında anlamsal bir fark yaratır. – chris

+8

İnsanların yakın oylamalarla agresif davranmaya başladığını düşünüyorum. Bunun yapıcı olmadığını nasıl görüyorum. –

+4

@LuchianGrigore: Anlaşıldı. Toplumun neden kendimi bu kadar katı hale getirdiğini merak ettim. Ben noktayı göremiyorum. –

cevap

58

. private, yalnızca sınıfın üyelerinin bu yöntemi çağırabileceğini veya bu değişkene (veya elbette arkadaşlarına) erişebileceğini söyler. Bu durumda, bir sınıfın private yapıcısını çağırmak için bu sınıfın (veya herhangi bir üyenin) static yönteminin yasal olması yasaldır. Bu silinen kurucular için geçerli değildir.

Örnek here.

+2

Gerek yok Foo (int) 'i bildirirseniz, Foo()' yu ilan edin. Foo() üretilmeyecek ve bu nedenle Foo f zaten geçersizdir. Yani örneğiniz silinen kurucunun durumunu göstermiyor. Kendiniz görün - http://ideone.com/mogiIF – mark

+1

@mark Noktayı ispatlamak için 2 kurucu yazdım. Düzenleyeceğim, herkese açık. –

+0

Farkı anlıyorum, genel olarak silme ifadesinin katma değerini ve özellikle bir kurucu için anlamıyorum. Sonuçta, vücut olmadan özel bir varsayılan kurucu belirtebilirdim. Daha sonra kod da sadece bağlantı sırasında başarısız olur. Eh, silinin niyetini daha açık bir şekilde ilettiğini görebiliyorum, ama bu konuyla ilgili. – mark

1

LLVM (örneğin AlignOf.h'de) kaynak kodunda "silindi" olarak bildirilen varsayılan katılılarla tanıştım. İlişkili sınıf şablonları genellikle 'llvm :: detail' adı verilen özel bir ad alanındadır. Buradaki bütün amaç, bu sınıfı sadece bir yardımcı sınıf olarak gördükleriydi. Asla onları örneklemeyi amaçlamadılar; sadece derleme zamanında çalışan bazı metaprogramlama püf noktaları ile bunları diğer sınıf şablonları bağlamında kullanmak için.

Ör. Bu AlignmentCalcImpl sınıf şablonu, yalnızca, aşağıdaki örnekte, (.) işleci için bir parametre olarak AlignOf adlı başka bir sınıf şablonunda kullanılır. Bu ifade, derleme zamanında değerlendirilebilir; ve şablonu başlatmaya gerek yok -> bu nedenle neden bu açıklamayı ifade etmek için varsayılan ctor silme beyan etmeyiniz.

Ancak bu sadece benim varsayımım.

İlgili konular