Nó có tốt để làm cho một constructor mặc định không thể sử dụng?


14

Hỏi cụ thể về hàm tạo mặc định

Cho rằng hàm tạo khởi tạo tất cả dữ liệu cho một đối tượng, nếu tôi tạo một lớp không thể được sử dụng mà không khởi tạo đúng, thì đó không phải là trường hợp hàm tạo mặc định là vô dụng? Xem xét:

// 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
}

Biến đó current_entrythực chất là vô dụng phải không? Nếu ai đó cố gắng xử lý nó sau này, họ có thể sẽ gặp lỗi; sau đó họ sẽ tạo mã để xử lý các lỗi đó ...

Để giảm thiểu mã bổ sung, không cần thiết như vậy: tại sao không làm cho hàm tạo mặc định không sử dụng được? Như vậy

...etc

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

...etc

PS: trên một lưu ý phụ, nếu không làm cho hàm tạo mặc định không thể sử dụng được, liệu có tốt không khi đặt cú ném đó vào tiêu đề, vì dù sao không có chi tiết triển khai nào khác được tiết lộ?

Câu trả lời:


34

Vâng, thật tốt (thật ra là tốt ) để làm cho hàm tạo mặc định không thể sử dụng được nếu không có cách nào hợp lý để khởi tạo đối tượng mà không có bất kỳ đối số nào. Nhưng đừng "vô hiệu hóa" nó bằng cách ném một ngoại lệ. Làm cho nó riêng tư thay thế. Lý tưởng nhất là giao diện của bạn sẽ không chứa bất kỳ phương thức hoặc hàm tạo nào mà mọi người "không cần phải gọi".


1
Vì vậy, bằng cách đặt nó ở chế độ riêng tư, người dùng cố gắng sử dụng hàm tạo mặc định sẽ gặp lỗi khi biên dịch?
dùng2738698

@ user2738698 Đúng.
Doval

8
Nếu bạn có thể sử dụng C ++ 11, thì hãy đánh dấu rõ ràng là đã xóa : CSV_Entry() = delete;.
bstamour

13
Trên thực tế, nó thậm chí không dễ dàng hơn thế này? Nếu bất kỳ hàm tạo không mặc định nào được xác định, trình biên dịch sẽ không hoàn toàn tạo một hàm tạo mặc định. Lớp này có một hàm tạo không mặc định được xác định (mà tôi khuyên dùng là explicitBTW). Vì vậy, nếu bạn không định nghĩa nó, nó sẽ không tồn tại.
Fred Larson

7
@FredLarson Xóa nó một cách rõ ràng thể hiện ý định xóa nó để không ai nghĩ đó là một sai lầm.
Darkhogg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.