Можно ли сделать конструктор по умолчанию непригодным для использования?

14

В частности, спрашивая о конструкторе по умолчанию

Учитывая, что конструктор инициализирует все данные для объекта, если я создаю класс, который не может быть использован без надлежащей инициализации, разве это не тот случай, когда конструктор по умолчанию бесполезен? Рассмотреть возможность:

// 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: на заметку, если можно просто сделать конструктор по умолчанию непригодным для использования, можно ли добавить этот заголовок в заголовок, так как никакие другие детали реализации не раскрываются?

user2738698
источник

Ответы:

34

Да, это нормально (на самом деле, это хорошо ) сделать конструктор по умолчанию непригодным, если нет разумного способа инициализации объекта без каких-либо аргументов. Но не «отключайте» его, выдавая исключение. Сделайте это приватным. В идеале ваш интерфейс не должен содержать никаких методов или конструкторов, которые люди «не должны» вызывать.

Doval
источник
1
Итак, сделав его закрытым, пользователь, пытающийся использовать конструктор по умолчанию, получит ошибку во время компиляции?
user2738698
@ user2738698 Правильно.
Довал
8
Если вы можете использовать C ++ 11, а затем явно пометить его как удалить: CSV_Entry() = delete;.
bstamour
13
На самом деле, разве это не проще, чем это? Если определены конструкторы не по умолчанию, компилятор не будет неявно создавать конструктор по умолчанию. В этом классе определен конструктор не по умолчанию (который я бы рекомендовал explicit, кстати). Так что, если вы просто не определите это, его не будет.
Фред Ларсон
7
@FredLarson Явное удаление этого выражает намерение удалить это, таким образом, никто не думает, что это было ошибкой.
Darkhogg