В частности, спрашивая о конструкторе по умолчанию
Учитывая, что конструктор инициализирует все данные для объекта, если я создаю класс, который не может быть использован без надлежащей инициализации, разве это не тот случай, когда конструктор по умолчанию бесполезен? Рассмотреть возможность:
// 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
}
Эта переменная current_entry
по сути бесполезна нет? Если кто-то попытается обработать его позже, он, скорее всего, получит ошибки; тогда они будут создавать код для обработки таких ошибок ...
Чтобы смягчить такой дополнительный, ненужный код: почему бы не сделать конструктор по умолчанию непригодным для использования? Вот так,
...etc
CSV_Entry() {
throw Verbose_Exception( "CSV_Entry: do not use the default constructor" );
}
...etc
PS: на заметку, если можно просто сделать конструктор по умолчанию непригодным для использования, можно ли добавить этот заголовок в заголовок, так как никакие другие детали реализации не раскрываются?
источник
CSV_Entry() = delete;
.explicit
, кстати). Так что, если вы просто не определите это, его не будет.