Nó không phải là một câu hỏi "làm thế nào để làm điều đó" nó là "làm thế nào để làm điều đó đúng cách"C++ 11 tham chiếu không sở hữu/con trỏ tới unique_ptr?
Tôi đang phát triển một trình soạn thảo trong Qt nơi các widget khác nhau hiển thị trẻ em và các biến (thành viên) của nó. Mỗi tiện ích con này phải giữ một tham chiếu/con trỏ tới con đã chỉnh sửa để hiển thị và thay đổi các biến thành viên của chúng.
Nỗ lực đầu tiên là cách ANSI C cũ mà tôi đã học (và vẫn bị mắc kẹt) với con trỏ thô đơn giản đến các đối tượng được sử dụng. Nó hoạt động tốt nhưng kể từ khi tiêu chuẩn C++ 11 hỗ trợ con trỏ thông minh và sử dụng chúng được khuyến khích tôi đang cố gắng sử dụng chúng.
Vấn đề là, tôi không hoàn toàn chắc chắn rằng "cách tốt nhất" để sử dụng chúng trong trường hợp này là những gì ... Sau khi đọc Smart Pointers: Or who owns you baby? và Which kind of pointer do I use when? và một vài người khác tôi đi đến những kết luận khác nhau:
Các đầu tiên là sử dụng *unique_ptr
vì đối tượng được chỉnh sửa rõ ràng là chủ sở hữu tạo và cũng xóa các con của nó. Các vật dụng chỉ đơn giản là đề cập đến đứa trẻ để hiển thị hoặc thay đổi chúng. Vấn đề là các tiện ích nên tham chiếu đến đứa trẻ như thế nào ...
hiện tại tôi vẫn đang sử dụng một con trỏ thô với phương pháp get()
của unique_ptr
nhưng điều này dường như không đúng với tôi. Tôi vẫn có thể gọi đến xóa trên con trỏ và hủy các lợi ích của con trỏ thông minh.
Cách tiếp cận thứ hai là sử dụng shared_ptr
vì nhiều đối tượng tham chiếu đến trẻ và chỉnh sửa nó. Ngoài ra tai nạn xóa nó trong một widget sẽ không gây hại vì nó vẫn thuộc sở hữu của các đối tượng khác. Vấn đề là họ sở hữu nó. Khi tôi muốn xóa nó khỏi đối tượng đã chỉnh sửa, tôi cũng phải báo hiệu tất cả các tiện ích để xóa nó trước khi nó thực sự biến mất. (điều này một lần nữa có vẻ thiếu sót và dễ bị lỗi)
Tôi không thực sự hài lòng với cả hai cách. Có cách nào sạch (er) để trỏ đến con unique_ptr
của đối tượng? Hay tôi thiếu một cách tiếp cận hoàn toàn khác và tốt hơn cho vấn đề này?
Bạn có cần các đối tượng tham chiếu được cảnh báo khi đối tượng được tham chiếu bị hủy? –
Trong những tình huống như vậy, chúng tôi thực sự cần [con trỏ thông minh câm] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3514.pdf). –
@BenjaminLindley Hiện tại, chúng cần được cảnh báo để xóa các tiện ích/điều khiển tương ứng và không sử dụng chúng khi đã xóa. ví dụ. một widget cần có được tọa độ của một đứa trẻ để đặt nó vào trong OpenGL renderview. Nhưng tôi thực sự cố gắng tránh điều này bởi vì mỗi widget cần phản ứng với tín hiệu phát ra. Nó sẽ là lý tưởng hơn khi chủ sở hữu có thể xác định chính nó cho dù một đối tượng vẫn còn tồn tại hay không. – nils277