Yapıcımı ne zaman / neden açıkça silmek isteyeyim? Sebebin kullanımını engellemek olduğunu varsayarsak, neden sadece yapmayasınız private?
class Foo
{
public:
Foo() = delete;
};
Yapıcımı ne zaman / neden açıkça silmek isteyeyim? Sebebin kullanımını engellemek olduğunu varsayarsak, neden sadece yapmayasınız private?
class Foo
{
public:
Foo() = delete;
};
delete. Hem soru hem de Luchian'ın cevabı kolaylıkla yapıcı olarak nitelendirilebilir. C ++ 11'in ince noktalarını solumayan ancak yakında her ikisinden de bir şeyler alması gerekecek olan herkes.
Yanıtlar:
Peki ya:
//deleted constructor
class Foo
{
public:
Foo() = delete;
public:
static void foo();
};
void Foo::foo()
{
Foo f; //illegal
}
karşı
//private constructor
class Foo
{
private:
Foo() {}
public:
static void foo();
};
void Foo::foo()
{
Foo f; //legal
}
Temelde farklı şeylerdir. privatesadece 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, o staticsınıfın (veya başka herhangi bir üyenin) bir yönteminin privatebir sınıfın yapıcısını çağırması yasaldır . Bu, silinmiş kurucular için geçerli değildir.
Buradan örnek alın .
yapıcı neden açıkça silinsin?
Başka neden:
Kullandığım deleteBir sınıf bir ilklendiricili denir sağlamak istediğinizde. Bunu, çalışma zamanı kontrolleri olmadan gerçekleştirmenin çok zarif bir yolu olarak görüyorum.
C ++ derleyicisi bu denetimi sizin için yapar.
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
Bu - çok basitleştirilmiş - kod, böyle bir örneklemenin olmamasını sağlar:Foo foo;
Foosayıda kurucuya sahip olsaydı, sadece varsayılan bir kurucu yoksa , Foo foo;eşleşemediği tüm örtük olarak tanımlanmış, korumalı ve özel kurucuları listeleyen çok daha uzun bir hataya neden olurdu.
LLVM kaynak kodunda (örneğin AlignOf.h dosyasında) 'silinmiş' olarak bildirilen varsayılan ctors ile tanıştım. İlişkili sınıf şablonları genellikle 'llvm :: detail' adlı özel bir ad alanında bulunur. Bence oradaki tüm amaç, o sınıfı yalnızca yardımcı bir sınıf olarak görmeleriydi. Onları somutlaştırmayı asla amaçlamadılar; bunları yalnızca derleme zamanında çalışan bazı meta programlama hileleriyle diğer sınıf şablonları bağlamında kullanmak için.
Örneğin. sadece AlignOf adlı başka bir sınıf şablonunda sizeof (.) operatörü için bir parametre olarak kullanılan bu AlignmentCalcImpl sınıf şablonu vardır. Bu ifade derleme zamanında değerlendirilebilir; ve şablonun somutlaştırılmasına gerek yoktur -> öyleyse neden bu niyeti ifade etmek için varsayılan ctor delete'ı bildirmiyorsunuz?
Ama bu sadece benim varsayımım.
= default, hatta sınıf kullanabilirsiniz, ve ben şahsen görme tercih silinen fonksiyonun kullanın. over Function özeldir. İlki açıkça "Bunun kullanılması amaçlanmamıştır" diyor. Bundan bir şey çıkarsa, sınıfın onu kullanamaması anlamsal bir fark yaratır.