2012-11-13 10 views
6

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?

+0

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? –

+0

@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

+0

Tak, to jest zupełnie zdrowe. Również nie potrzebujesz '.get()'. – atzz

Odpowiedz

9

Parametr jest parametrem szablonu w samym shared_ptr, podczas gdy parametr Y jest parametrem szablonu na tym konkretnym konstruktorze shared_ptr. Coś w tym stylu:

template< class T > 
class shared_ptr 
{ 
    template< class Y > 
    shared_ptr(const shared_ptr<Y>& r, T *ptr); 
} 

Co do przykładowego kodu, który napisałeś, to wygląda dla mnie dobrze.

+0

Każdy ma rację - wygrywasz, bo jesteś trochę szybszy. Czuję się trochę głupia - najwyraźniej ostatnio nie robiłem zbyt wielu szablonów. Całkowicie zapomniałem o szablonach członków. – Steve314

4

Dokumentacja jest poprawna. Zapominasz, że jest to dokumentacja konstruktor w klasie szablonu shared_ptr<T> tj deklaracja klasy wykwalifikowanych konstruktora jest:

template<typename T> 
template<typename Y> 
shared_ptr<T>::shared_ptr(const shared_ptr<Y>& r, T *ptr); 

Więc w przykładzie T jest int i Y jest s.

2

T to parametr szablonu klasy, a nie konstruktora. I to dokładnie tak, jak powinno być: Wskaźnik do elementu musi mieć typ elementu i zapomnieć/wymazać (patrz typ-wymazanie) typ obiektu zawierającego (w tym przypadku: Y).

Kod zostanie zaksięgowana powinien działać, można nawet napisać to trochę prostsze jak:

shared_ptr<int> s2 (s1, &s1->a); 
+0

Z jakiegoś powodu nigdy nie jestem pewien co do priorytetu '&' - prawdopodobnie dlatego, że zawsze dodam dodatkowe parens zamiast sprawdzania. 'Get' było także celowe, ale nie jestem pewien, czy rozumowanie robienia rzeczy bardziej wyraźne ma sens. Powinienem naprawdę trzymać się z obwinianiem mojego bólu głowy. – Steve314

Powiązane problemy