В принципе разрешено выходить из классов STL, см. here и here. Однако вы должны знать, что в этом случае вы не должны работать с указателем на базовый класс, то есть std::shared_ptr<myotherclass>*
.
Так что это и их варианты должны быть запрещены:
std::shared_ptr<myotherclass>* ptr = new myclass(/* ... */);
... но согласился, что выглядит немного синтетику.
Почему это запрещено? Поскольку классы STL не имеют виртуального деструктора. Поэтому, когда вы хотите, чтобы ваш выделенный класс delete
, производная часть остается. Это, в свою очередь, вызывает undefined behaviour и, возможно, создает утечку памяти, даже если у вас нет определенных распределений в производном классе.
Для того, чтобы сделать это, одна возможность заключается в том, чтобы получить в частном порядке от shared_ptr
:
class myclass : private std::shared_ptr<myotherclass> {};
^^^^^^^
Это, однако, может привести к проблемам с бинарной совместимости см комментарии к this answer.
На руке, даже если первая разрешена, вы можете использовать менее склонную к ошибкам и использовать композицию, в которой вы делаете shared_ptr
членом myclass
и выставляете требуемую функциональность (с недостатком, который вы иногда имеете много разоблачить). Или вы можете настроить автономную функцию, которая делает то, что вы хотите ... Я знаю, что вы знали это ;-)
Что такого хорошего в том, чтобы делать что-то подобное? – Drax
В большинстве случаев вы должны иметь возможность описать отношения наследования с английской фазой «есть». Итак, в приведенном выше случае вы говорите: myclass "является" std :: shared_ptr. Это, вероятно, не то, что вы имеете в виду. –
Это не «плохо», а «странно». Разумеется, это должно быть членом самого «myotherclass» (или, возможно, не являющегося членом, действующим на «myotherclass»), а не что-то, связанное с определенным типом интеллектуального указателя? –