Czy inteligentne wskaźniki obsługują odlewanie w dół, a jeśli nie, to w jaki sposób można obejść to ograniczenie?W jaki sposób powinny być rzucane inteligentne wskaźniki?
Przykładem tego, co próbuję zrobić, jest posiadanie dwóch wektorów STL (na przykład) zawierających inteligentne wskaźniki. Pierwsza zawiera inteligentne wskaźniki do klasy bazowej, a druga zawiera inteligentne wskaźniki do klasy pochodnej. Inteligentne wskaźniki są indeksowane, np. podobne zachowanie do shared_ptr z Boost, ale ręcznie zwijane. Podaję przykładowy kod, który mam do bitej stanowić przykład:
vector<CBaseSmartPtr> vecBase;
vector<CDerivedSmartPtr> vecDer;
...
CBaseSmartPtr first = vecBase.front();
vecDer.push_back(CDerivedSmartPtr(dynamic_cast<CDerived*>(first.get()));
Wydaje nie bezpieczne do mnie, myślę, że kończy się dwa wskaźniki inteligentne zarządzanie tego samego obiektu. W pewnym momencie może to spowodować, że jeden z nich zwolni obiekt, podczas gdy drugi nadal będzie zawierał odniesienia do niego.
To, na co mam nadzieję, ale nie sądzę, że zadziała, to prosta obsada przy zachowaniu tego samego obiektu, np.
dynamic_cast<CDerivedSmartPtr>(first)
powinienem szukać zmienić drugi pojemnik również użyć CBaseSmartPtr i przygnębiony tylko na wykorzystanie? Czy są inne rozwiązania?
Czemu tworzyć własne? – GManNickG
Myślę, że jest to interesujące pytanie, ponieważ dostaje się do wnętrza inteligentnych implementacji wskaźnika. Ale chciałbym również podkreślić, że budowanie downcastingu w twojej strategii oznacza wadę projektu, IMHO. –
Aby odpowiedzieć na pytanie, dlaczego robię swoje własne, to starsze kody i wyrwanie bieżącego użycia i zastąpienie go Boost byłoby całkiem dużą zmianą. To jest na mojej liście "przyszłych rzeczy, na które warto spojrzeć". – dlanod