Nie jestem pewien, czy jestem bardziej cierpi z błędu dokumentacji lub ból głowy, więc ...Jak utworzyć składnik shared_ptr dla członka?
Co chcę zrobić, to stworzyć shared_ptr że własność akcji z innym, ale który odwołuje członka obiekt zamiast całego obiektu. Prosty przykład, punktem wyjścia ...
struct s
{
int a, b;
};
shared_ptr<s> s1 (new s); // pointing to whole object
Od en.cppreference.com, konstruktor (8) z shared_ptr jest ...
template< class Y >
shared_ptr(const shared_ptr<Y>& r, T *ptr);
Opis wspomina „Tworzy shared_ptr który dzieli informacje o własności z R, ale przechowuje niepowiązany i niezarządzany wskaźnik ptr ... taki jak w typowych przypadkach użycia, gdzie ptr jest członkiem obiektu zarządzanego przez r ".
Tak ... Czy przypadkiem nie przeoczyłem szablonu w tym konstruktorze, czy też czegoś brakuje? Właściwie Y wygląda na to, że to też jest złe dla mnie, więc ogólnie rzecz biorąc, czy ten konstruktor został poprawnie opisany?
Co mam nadzieję, mogę zrobić coś takiego ...
shared_ptr<int> s2 (s1, &(s1.get()->a));
s2
wskazuje na członka a
(AN int
), ale akcja własność całego obiektu z s1
.
Czy to jest zdrowe?
Może ja czegoś brakuje, ale dlaczego chcesz shared_ptr do var członkowskim, które nie są przydzielone na kupie? tzn. dlaczego nie używać tylko surowego wskaźnika dla s2? –
@RC - aby upewnić się, że jeśli oryginalny shared_ptr zostanie zwolniony, sam obiekt go nie - tj. Upewnij się, że s2 nie staje się zwisającym wskaźnikiem. W rzeczywistym świecie zakresy s1 i s2 nie będą takie same. – Steve314
Tak, to jest zupełnie zdrowe. Również nie potrzebujesz '.get()'. – atzz