To raczej nie jest pytanie "jak to zrobić" to raczej "jak to zrobić we właściwy sposób"C++ 11 non-owning reference/pointer do unique_ptr?
Zajmuję się edytowaniem w Qt, gdzie różne widgety wyświetlają dzieci i jego zmienne (członkowskie). Każdy z tych widgetów powinien zawierać odniesienie/wskaźnik do edytowanego potomka, aby wyświetlić i zmienić jego zmienne składowe.
Pierwsza próba była starą metodą ANSI C, której nauczyłem się (i nadal trochę utknąłem) za pomocą prostego wskaźnika surowego do używanych obiektów. Działa dobrze, ale ponieważ standard C++ 11 obsługuje inteligentny wskaźnik, a ich używanie jest zalecane, staram się z nich korzystać.
Problem polega na tym, że nie jestem pewien, co to jest „najlepszy sposób”, aby je zastosować w tym przypadku ... Po przeczytaniu Smart Pointers: Or who owns you baby? i Which kind of pointer do I use when? i kilka innych doszedłem do innych wniosków:
najpierw należy użyć *unique_ptr
, ponieważ edytowany obiekt jest wyraźnie właścicielem, który tworzy i usuwa jego potomka. Widżety odnoszą się po prostu do dziecka, aby je pokazać lub zmienić. Problemem jest to, w jaki sposób należy widgety odnoszą się do dziecka ...
teraz jestem po prostu nadal używa surowego wskaźnik dostałem ze sposobu unique_ptr
get()
ale to wydaje się trochę wadliwa do mnie. Nadal mogę przypadkowo usunąć połączenie na wskaźniku i anulować korzyści z inteligentnego wskaźnika.
Drugim podejściem jest użycie shared_ptr
, ponieważ wiele obiektów odnosi się do dziecka i edytuje je. Również przypadkowe usunięcie go w jednym widżecie nie zaszkodzi, ponieważ nadal jest własnością innych obiektów. Problem polega na tym, że są jego właścicielami. Kiedy chcę usunąć go z edytowanego obiektu, muszę również zasygnalizować wszystkie widżety, aby je skasować, zanim naprawdę zniknie. (to znowu wydaje się wadliwe i podatne na błędy)
Nie jestem zadowolony z obu sposobów. Czy istnieje czysty (er) sposób wskazywania potomka obiektu obiektu unique_ptr
? Czy może brakuje mi zupełnie innego i lepszego podejścia do tego problemu?
Czy potrzebujesz obiektów referencyjnych do ostrzeżenia, gdy przywoływany obiekt jest zniszczony? –
W tego rodzaju sytuacjach naprawdę potrzebujemy [głupich inteligentnych wskaźników] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3514.pdf). –
@BenjaminLindley Na razie muszą zostać powiadomione, aby usunąć odpowiednie widżety/kontrolki i nie używać ich po usunięciu. na przykład jeden widget potrzebuje uzyskać współrzędne jednego potomka, aby umieścić je w widoku renderowania OpenGL. Ale naprawdę staram się tego uniknąć, ponieważ każdy widget musi reagować na emitowany sygnał. Byłoby bardziej idealne, gdyby właściciel mógł sam określić, czy obiekt nadal istnieje, czy nie. – nils277