Va bene rendere inutilizzabile un costruttore predefinito?


14

In particolare chiedendo informazioni sul costruttore predefinito

Dato che il costruttore inizializza tutti i dati per un oggetto, se creo una classe che non può essere utilizzata senza una corretta inizializzazione, non è il caso che il costruttore predefinito sia inutile? Ritenere:

// 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
}

Quella variabile current_entryè essenzialmente inutile no? Se qualcuno tenta di elaborarlo in un secondo momento, probabilmente otterrebbero errori; quindi avrebbero creato il codice per gestire tali errori ...

Per mitigare tale codice aggiuntivo e non necessario: perché non rendere inutilizzabile il costruttore predefinito? Così,

...etc

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

...etc

PS: una nota a margine, se va bene rendere inutilizzabile il costruttore predefinito, va bene mettere quel lancio nell'intestazione, dal momento che nessun altro dettaglio di implementazione viene rivelato comunque?

Risposte:


34

Sì, va bene (in realtà è buono ) rendere inutilizzabile il costruttore predefinito se non esiste un modo ragionevole di inizializzare l'oggetto senza alcun argomento. Ma non "disabilitarlo" lanciando un'eccezione. Renderlo invece privato. Idealmente la tua interfaccia non conterrà alcun metodo o costruttore che la gente "non dovrebbe" chiamare.


1
Quindi, rendendolo privato, l'utente che tenta di utilizzare il costruttore predefinito riceverà un errore in fase di compilazione?
user2738698

@ user2738698 Corretto.
Doval,

8
Se è possibile utilizzare C ++ 11, poi segnare esplicitamente come cancellato: CSV_Entry() = delete;.
bstamour,

13
In realtà, non è nemmeno più facile di così? Se vengono definiti costruttori non predefiniti, il compilatore non creerà implicitamente un costruttore predefinito. Questa classe ha un costruttore non predefinito definito (che consiglierei di essere explicit, BTW). Quindi se non lo definisci, non esisterà.
Fred Larson,

7
@FredLarson L'eliminazione esplicita esprime l'intenzione di eliminarla, quindi nessuno pensa che sia stato un errore.
Darkhogg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.