Использую shared_ptr, а точнее — QSharedPointer, но думаю, что принципы не сильно отличаются.
Делаю dynamic_cast от того указателя, который хранится в QSharedPointer.
Пока использую его локально, и храню голеньким, но задумался о более длительном его хранении и передаче в разные места. И хочется тоже хранить его в каком-то шареде.
Вижу проблему, что с точки зрения языка и среды выполнения это вроде как два разных указателя, но счётчик-то у них должен быть общий. Наверняка этот вопрос кто-то прорабатывал, просто я не в курсе
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Использую shared_ptr, а точнее — QSharedPointer, но думаю, что принципы не сильно отличаются. M>Делаю dynamic_cast от того указателя, который хранится в QSharedPointer.
Вдобавок к уже данному ответу, у QSharedPointer есть qSharedPointerDynamicCast.
Но вообще главное, что у shared_ptr на все такие случаи есть это aliasing constructor.
(8) на cppreference.
template< class Y >
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;
С его помощью можно сделать и dynamic_pointer_cast, и your_custom_cast, и указатель на член объемлющей структуры, разделяющий счётчик с основным указателем.
В QSharedPointer, похоже его не завезли, так что там только частное решение.
Здравствуйте, Alexander G, Вы писали:
M>>Использую shared_ptr, а точнее — QSharedPointer, но думаю, что принципы не сильно отличаются. M>>Делаю dynamic_cast от того указателя, который хранится в QSharedPointer.
AG>Вдобавок к уже данному ответу, у QSharedPointer есть qSharedPointerDynamicCast.
Предыдущий оратор метнул ссылку, и был таков. Он видимо думает, что я в состоянии сейчас сам разбираться с этим вопросом
Спасибо за довольно развёрнутый ответ. Как минимум, по сравнению с предыдущим
В догонку вопрос — не встречал на русском ничего на эту тему, чтобы попроще было разжеваноизложено?
Здравствуйте, Marty, Вы писали:
M>Пока использую его локально, и храню голеньким, но задумался о более длительном его хранении и передаче в разные места. И хочется тоже хранить его в каком-то шареде.
Сначала не понял чего ты хочешь.
Потом вроде понял.
У тебя есть QSharedPointer<Base>, ты хочешь получить из него
QSharedPointer<DerivedFromBase>, который бы разделял владение с
первоначальным объектом?
Если да, то у QSharedPointer есть
QSharedPointer<X> dynamicCast() const
З.Ы. Еще напомню что в Qt есть
QSharedData, QSharedDataPointer и QExplicitlySharedDataPointer — это
если тебе нужен COW (автоматически или руками).