¿Está bien hacer que un constructor predeterminado sea inutilizable?

14

Preguntando específicamente sobre el constructor predeterminado

Dado que el constructor inicializa todos los datos de un objeto, si creo una clase que no se puede usar sin la inicialización adecuada, ¿no es el caso que el constructor predeterminado sea inútil? Considera:

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

Esa variable current_entry es esencialmente inútil, ¿no? Si alguien intenta procesarlo más tarde, es probable que obtenga errores; luego crearían un código para manejar tales errores ...

Para mitigar este código adicional e innecesario: ¿por qué no inutiliza el constructor predeterminado? Como tal,

...etc

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

...etc

PS: en una nota al margen, si está bien simplemente hacer que el constructor predeterminado sea inutilizable, ¿está bien colocar ese lanzamiento en el encabezado, ya que de todos modos no se revelan otros detalles de implementación?

    
pregunta user2738698 26.03.2014 - 18:55

1 respuesta

33

Sí, está bien (en realidad, es bueno ) hacer que el constructor predeterminado sea inutilizable si no hay una forma sensata de inicializar el objeto sin ningún argumento. Pero no lo "deshabilites" lanzando una excepción. Hazlo privado en su lugar. Lo ideal es que su interfaz no contenga ningún método o constructor que la gente "no deba" llamar.

    
respondido por el Doval 26.03.2014 - 19:03

Lea otras preguntas en las etiquetas