W zasadzie można czerpać z klas STL, patrz: here i here. Musisz jednak pamiętać, że nie powinieneś pracować z wskaźnikiem do klasy bazowej - w tym przypadku jest to std::shared_ptr<myotherclass>*
.
Więc i jego warianty powinny być zakazane:
std::shared_ptr<myotherclass>* ptr = new myclass(/* ... */);
... ale zgodzili się, że wygląda syntetycznych bitów.
Dlaczego jest to zabronione? Ponieważ klasy STL nie mają wirtualnego destruktora. Więc jeśli chcesz uzyskać przydzieloną klasę, część pochodna pozostaje. To z kolei wywołuje undefined behaviour i prawdopodobnie tworzy przeciek pamięci - nawet jeśli nie masz pewnych alokacji w swojej klasie pochodnej.
W tym celu, jedną z możliwości jest czerpać prywatnie od shared_ptr
:
class myclass : private std::shared_ptr<myotherclass> {};
^^^^^^^
To jednak może doprowadzić do problemów z kompatybilności binarnej, patrz komentarze do this answer.
Na ręce, nawet jeśli pierwsza jest dozwolona, można przejść na mniej podatne na błędy i albo użyć kompozycji, gdzie dokonać shared_ptr
członkiem myclass
i wystawiać wymaganą funkcjonalność (z wadą, że czasami masz bardzo dużo eksponować). Lub możesz ustawić autonomiczną funkcję, która robi to, co chcesz ... Wiem, że to wiedziałeś ;-)
Co jest takiego dobrego w robieniu czegoś takiego? – Drax
W większości przypadków powinieneś być w stanie opisać związek dziedziczenia z fazą angielską "is a". Więc w powyższym przypadku mówisz: myclass "jest" std :: shared_ptr. Prawdopodobnie nie o to ci chodzi. –
To nie jest tak źle jak "dziwne". Z pewnością powinien to być członek 'myotherclass' sam (lub może nie będący członkiem działający na' myotherclass'), a nie coś przykręconego do jakiegoś konkretnego typu inteligentnego wskaźnika? –