Varsayılan bir yapıcıyı kullanılamaz hale getirmek iyi bir şey midir?


14

Özellikle varsayılan kurucu hakkında soru sorma

Yapıcı bir nesnenin tüm verilerini başlatırsa, düzgün başlatma olmadan kullanılamayan bir sınıf oluşturursam, varsayılan kurucunun işe yaramaz olması gerekmez mi? Düşünmek:

// A class for handling lines in a CSV file
class CSV_Entry {
private:
    unsigned num_entries;
    std::string string_version;
    std::vector<std::string> vector_version;
    ...etc
public:
    CSV_Entry();
    CSV_Entry(const std::string& src_line);

    // returns a vector copy of the original entry
    std::vector<std::string> get_vector_snapshot();
}

int main( void ) {
    ...etc

    CSV_Entry example = CSV_Entry();
    std::vector<std::string> current_entry = example.get_vector_snapshot();

    ...etc
}

Bu değişken current_entryaslında işe yaramaz değil mi? Birisi daha sonra işlemeye çalışırsa, muhtemelen hata alırlar; o zaman bu hataları işlemek için kod oluştururlar ...

Bu tür ek, gereksiz kodları azaltmak için: neden varsayılan kurucuyu kullanılamaz hale getirmiyorsunuz? Bunun gibi,

...etc

CSV_Entry() {
    throw Verbose_Exception( "CSV_Entry: do not use the default constructor" );
}

...etc

Not: bir yan notta, varsayılan kurucuyu kullanılamaz hale getirmenin iyi olması durumunda, başka bir uygulama ayrıntısı yine de açıklanmadığından, başlığı atmak iyi olur mu?

Yanıtlar:


34

Evet, nesneyi herhangi bir argüman olmadan başlatmanın mantıklı bir yolu yoksa varsayılan kurucuyu kullanılamaz hale getirmek iyidir (aslında iyidir ). Ancak bir istisna atarak "devre dışı bırakmayın". Bunun yerine özel yap. İdeal olarak arayüzünüzde insanların "yapması gerekmeyen" herhangi bir yöntem veya kurucu bulunmayacaktır.


1
Yani, özel yaparak, varsayılan yapıcı kullanmaya çalışan kullanıcı derleme zamanında bir hata alırsınız?
user2738698

@ user2738698 Doğru.
Doval

8
Eğer C ++ 11 kullanabiliyorsa silinmiş olarak, daha sonra açıkça işaretlemek: CSV_Entry() = delete;.
bstamour

13
Aslında bundan daha kolay değil mi? Herhangi bir varsayılan olmayan kurucu tanımlanmışsa, derleyici varsayılan bir kurucu oluşturmaz. Bu sınıf varsayılan olmayan bir yapıcı tanımlı (ki ben tavsiye ederim explicit, BTW) vardır. Yani sadece tanımlamazsanız, var olmayacaktır.
Fred Larson

7
@FredLarson Açık bir şekilde silmek, onu silme niyetini ifade eder, böylece kimse bunun bir hata olduğunu düşünmez.
Mart'ta Darkhogg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.