#c #shared-ptr #smart-pointers #weak-ptr
#c #общий доступ-ptr #интеллектуальные указатели #слабый ptr
Вопрос:
Пусть класс A и класс B. Каждому экземпляру класса A принадлежит от 0 до N экземпляров класса B. Когда экземпляр A удаляется, экземпляры B также удаляются.
Например :
class parent
{
private:
vector< unique_ptr< child > > m_children;
public:
weak_ptr< child > create_child()
{
m_children.push_back( move( make_unique< child >( ??? ) ) );
return m_children.back();
}
};
class child
{
private:
weak_ptr< parent > m_parent;
public:
child( weak_ptr< parent > parent ) : m_parent( parent ) { }
};
Можно было бы shared_ptr< parent >
вручную создать child
, используя этот указатель. Но в пределах класса parent
все, что у нас есть, this
это shared_ptr
, а не this
to parent
, потому что мы понятия не имеем о том, какой weak_ptr
экземпляр хранится, и, следовательно, мы не можем создать shared_ptr
из этого в, которого у нас нет.
Итак, мой вопрос: как вы можете проверить, в пределах child
области видимости класса, что parent
экземпляр не был выпущен перед его использованием? Как я могу вернуть «безопасный» указатель при создании child
? Спасибо.
Комментарии:
1. Вы не можете получить a
weak_ptr
из aunique_ptr
, только изshared_ptr
.2. Вы, вероятно, ищете
std::enable_shared_from_this
.3. Почему
create_child
нужно возвращать слабый указатель? Почему вы не можете вернуть обычный указатель? Вы говорите, что вам нужен безопасный указатель, но почему простой указатель не является безопасным в вашем случае?4. Интеллектуальные указатели не являются удобным способом делегирования всех обязанностей среде выполнения: вы должны понимать проблемы, которые пытаетесь решить, и только тогда, когда проблема не может быть решена детерминированным способом (например, требуется время жизни в течение нескольких потоков), тогда вам нужен интеллектуальный подсчет ссылок и
weak_ptr
5. Поскольку
child
хранится какunique_ptr
внутриparent
, нет смысла проверять вchild
области видимости класса, котораяparent
была выпущена , поскольку она уже была бы уничтожена приparent
выпуске. Я предполагаю, что вы имеете в виду автоматическую проверку существованияchild
экземпляра, прежде чем использовать указатель на него вместо этого. Если я прав, то вам понадобится немного больше, чем просто фабрика для родительского элемента, который возвращаетshared_ptr
. Илиunique_ptr< child >
это было просто упрощением реального кода для этого вопроса здесь?