Tại sao luồng Thư viện chuẩn C++ sử dụng open()
/close()
ngữ nghĩa được tách riêng khỏi thời gian tồn tại của đối tượng? Kết thúc hủy diệt vẫn có thể làm cho các lớp RAII kỹ thuật, nhưng việc mua lại/giải phóng độc lập để lại các lỗ hổng trong phạm vi mà tay cầm có thể trỏ tới không có gì nhưng vẫn cần kiểm tra thời gian chạy.Tại sao luồng tệp chuẩn C++ không tuân theo quy ước RAII chặt chẽ hơn?
Tại sao các nhà thiết kế thư viện chọn cách tiếp cận của họ hơn là chỉ mở cửa trong các nhà thầu mà ném vào một thất bại?
void foo() {
std::ofstream ofs;
ofs << "Can't do this!\n"; // XXX
ofs.open("foo.txt");
// Safe access requires explicit checking after open().
if (ofs) {
// Other calls still need checks but must be shielded by an initial one.
}
ofs.close();
ofs << "Whoops!\n"; // XXX
}
// This approach would seem better IMO:
void bar() {
std_raii::ofstream ofs("foo.txt"); // throw on failure and catch wherever
// do whatever, then close ofs on destruction ...
}
Một từ ngữ tốt hơn của câu hỏi có thể là lý do tại sao quyền truy cập không mở là fstream
là điều đáng từng có. Kiểm soát thời gian mở tập tin thông qua cuộc đời xử lý dường như không phải là một gánh nặng gì cả, nhưng thực sự là một lợi ích an toàn.
Có, nó chắc chắn thiếu giá trị chế độ 'throw_exception'. Có thể thiết lập các ngoại lệ cho các hoạt động sau này, nhưng việc ném constructor sẽ tốt hơn. –