W szczególności pytanie o domyślny konstruktor
Biorąc pod uwagę, że konstruktor inicjuje wszystkie dane dla obiektu, jeśli utworzę klasę, której nie można użyć bez odpowiedniej inicjalizacji, czy nie jest tak, że domyślny konstruktor jest bezużyteczny? Rozważać:
// 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
}
Ta zmienna current_entry
jest zasadniczo bezużyteczna nie? Jeśli ktoś spróbuje go później przetworzyć, prawdopodobnie wystąpią błędy; wtedy stworzyliby kod do obsługi takich błędów ...
Aby złagodzić taki dodatkowy, niepotrzebny kod: dlaczego nie uczynić domyślnego konstruktora bezużytecznym? Tak jak
...etc
CSV_Entry() {
throw Verbose_Exception( "CSV_Entry: do not use the default constructor" );
}
...etc
PS: na marginesie, jeśli można po prostu sprawić, że domyślny konstruktor nie nadaje się do użytku, czy dobrze jest umieścić ten rzut w nagłówku, ponieważ i tak nie ujawniono żadnych innych szczegółów implementacji?
źródło
CSV_Entry() = delete;
.explicit
BTW). Więc jeśli tego nie zdefiniujesz, nie będzie istniał.