É correto tornar um construtor padrão inutilizável?

14

Especificamente perguntando sobre o construtor padrão

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

// 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 receberão erros; então eles criariam código para lidar com tais erros ...

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

...etc

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

...etc

PS: em uma nota lateral, se for bom apenas tornar o construtor padrão inutilizável, será bom colocar esse lance no cabeçalho, já que nenhum outro detalhe de implementação é revelado de qualquer maneira?

    
por user2738698 26.03.2014 / 18:55
fonte

1 resposta

33

Sim, está tudo bem (na verdade, é bom ) para tornar o construtor padrão inutilizável se não houver uma maneira correta de inicializar o objeto sem nenhum argumento. Mas não "desabilite", jogando uma exceção. Torne-o privado em vez disso. Idealmente, sua interface não conterá nenhum método ou construtor que as pessoas "não deveriam" chamar.

    
por 26.03.2014 / 19:03
fonte