Создание weak_ptr без наличия другого интеллектуального указателя

#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 из a unique_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 > это было просто упрощением реального кода для этого вопроса здесь?