web-dev-qa-db-ja.com

デフォルトのコンストラクタを使用不可にしても問題ありませんか?

具体的にはデフォルトのコンストラクタについて尋ねる

コンストラクターがオブジェクトのすべてのデータを初期化する場合、適切な初期化なしでは使用できないクラスを作成すると、デフォルトのコンストラクターが役に立たないのではないですか?検討してください:

// 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:余談ですが、デフォルトのコンストラクタを使用不可にしても問題ない場合は、他の実装の詳細が明らかにされていないため、そのスローをヘッダーに入れても問題ありませんか?

14
user2738698

はい、引数なしでオブジェクトを初期化するための賢明な方法がない場合は、デフォルトのコンストラクタを使用不可にしても問題ありません(実際にはgood)。 ただし、例外をスローして「無効」にしないでください。代わりにプライベートにしてください。理想的には、インターフェイスには、ユーザーが「呼び出すことを想定していない」メソッドやコンストラクターを含めないでください。

34
Doval