xem xét lớp này:Loại đối tượng nào nên chức năng này trả về?
class Widget
{
Widget::Widget();
bool initialize();
}
Một Widget
có những đặc điểm sau đây:
initialize()
phải được viện dẫn để xây dựng đầy đủinitialize()
có thể thất bạiinitialize()
là tốn kém
Cho rằng, tôi đang đóng gói sáng tạo trong chức năng nhà máy luôn trả về cùng Widget
dụ:
Widget* widget() {
static auto w = new Widget;
static auto initialized = false;
if (!initialized) {
if (!w->initialize()) {
return nullptr;
}
initialized = true;
}
return w;
}
Cái kiểu trả về của widget()
nên được?
Cụ thể, tôi muốn bằng cách nào đó làm rõ rằng tuổi thọ của trả lại Widget
sẽ tồn tại lâu hơn bất kỳ người gọi nào, nhưng không tham chiếu đến việc triển khai nội bộ.
- Trả về con trỏ thô và thêm nhận xét cho biết "Con trỏ được trả về trỏ tới đối tượng có thời lượng lưu trữ tĩnh sẽ không bị xóa trước khi kết thúc chương trình". Điều này rất đơn giản, nhưng không phải là tự tạo tài liệu.
- Trả lại số
std::shared_ptr<Widget>
. Đây là tự tài liệu, nhưng tôi không thích nó sẽ giới thiệu hoàn toàn không cần thiết tham chiếu đếm trên không. - Trả lại
std::unique_ptr<Widget>
với chức năng tùy chỉnh deleter là no-op. Tôi nghĩ rằng điều này có cùng một vấn đề nhận thức như # 2 nếu người gọi chuyển đổi nó thành mộtshared_ptr
.
Nó thực sự là một vấn đề quan trọng, nhưng trong trường hợp cụ thể này, tôi sẽ không lo lắng về việc nạp tiền trên cao. Nếu loại Tiện ích con của bạn "đắt tiền" để tạo, hơn bất kỳ "chi phí đếm tài liệu tham khảo không cần thiết" nào có thể là tầm thường bằng cách so sánh. – MrEricSir
Ngôn ngữ C++ không khuyến khích sử dụng giao diện đủ. Nhưng có, họ là một pita hoàn chỉnh để gỡ lỗi, việc triển khai thực hiện rất khó để vượt qua. –
Chúng ta có nên bỏ qua sự đa dạng không tin cậy của điều này? (Ngay cả trong C++ 11 này không an toàn) –