首页 > 解决方案 > 使用智能指针的 OOP 父/子关系

问题描述

我正在尝试学习如何有效地使用智能指针,并在更“OOP”的意义上进行编程。

基本上我遇到的问题如下:

// base class example
class class_a {
public:
    virtual void func( ) = 0;

    std::shared_ptr< class_a > m_parent;
    std::vector< std::shared_ptr< class_a > > m_children { };

    void add_child( std::shared_ptr< class_a > a ) {
        m_parent = this; // here! how could I go about this?
        m_children.emplace_back( a );
    }
};

// derived class example
class class_b : public class_a {
    int m_var { };

public:
    class_b( int param ) : m_var( param ) { }

    void func( ) override {
        // stuff
    }
};

/*
 * elsewhere
 */
auto parent = std::make_shared< class_b >( 14 );
{
    // class_c inherits 'class_a' like 'class_b'
    auto child = std::make_shared< class_c >( 6 );
    {
        // more children
    }
    parent->add_child( child );
}

问候。

标签: c++oopsmart-pointers

解决方案


您似乎正在尝试将新孩子“连接”到其父母。

然后只需为子内部变量分配一个引用。

a->m_parent = this;

正如其他人指出的那样,使用weak_ptr而不是共享指针来保存来自您的孩子(ren)的父引用,否则在删除您的父节点时,父节点仍然会从孩子那里保持活动状态,而不是被垃圾收集。


推荐阅读