É bom inutilizar um construtor padrão?

14

Perguntando especificamente sobre o construtor padrão

Dado que o construtor inicializa todos os dados de um objeto, se eu criar uma classe que não pode ser usada sem a inicialização adequada, não é o caso de o construtor padrão ser inútil? Considerar:

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

Essa variável current_entryé essencialmente inútil, não? Se alguém tentar processá-lo mais tarde, provavelmente obterá erros; então eles criavam código para lidar com esses erros ...

Para mitigar esse código adicional desnecessário: por que não tornar o construtor padrão inutilizável? Igual a,

...etc

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

...etc

PS: em uma nota lateral, se é bom apenas inutilizar o construtor padrão, é bom colocar esse lance no cabeçalho, pois nenhum outro detalhe da implementação é revelado?

user2738698
fonte

Respostas:

34

Sim, é bom (na verdade, é bom ) tornar o construtor padrão inutilizável se não houver uma maneira sensata de inicializar o objeto sem argumentos. Mas não o "desative" lançando uma exceção. Torne-o privado. Idealmente, sua interface não conterá nenhum método ou construtor que as pessoas "não deveriam" chamar.

Doval
fonte
1
Então, ao torná-lo privado, o usuário que tenta usar o construtor padrão receberá um erro no momento da compilação?
user2738698
@ user2738698 Correto.
Doval
8
Se você pode usar C ++ 11, em seguida, marcar explicitamente como excluída: CSV_Entry() = delete;.
bstamour
13
Na verdade, não é ainda mais fácil do que isso? Se qualquer construtor não padrão for definido, o compilador não criará implicitamente um construtor padrão. Essa classe tem um construtor não padrão definido (o que eu recomendaria ser explicit, BTW). Portanto, se você simplesmente não o definir, ele não existirá.
Fred Larson
7
A exclusão explícita de @FredLarson expressa a intenção de excluí-lo, para que ninguém pense que foi um erro.
Darkhogg 26/03