c++ - 赋予容器其子代的所有权,但让子代使用智能指针存储对其父代的引用

标签 c++ c++11 shared-ptr smart-pointers weak-ptr

我希望一棵树中Node的所有子级都归其父级所有,并让每个子级都存储对其父级的引用。这样,当父Node被销毁时,其所有子级都将被自动销毁。我还希望,如果树的根节点被破坏,整个树将被安全地释放。

Node.h

#include <vector>

template <typename T>
class Node :
    public std::enable_shared_from_this<Node<T>>
{

private:
    T data_;
    std::weak_ptr<Node> parent_;
    std::vector<std::shared_ptr<Node>> children_;

public:
    Node(const T& data) : data_(data) {}
    Node(const T&& data) : data_(data) {}

    // For debug-purposes only
    ~Node()
    {
        std::cout << data_ << "Destroyed" << std::endl;
    }

    T& getData() const
    {
        return data_;
    }

    void setData(const T& data)
    {
        data_ = data;
    }

    void addChild(std::shared_ptr<Node> child) const
    {
        child->parent_ = this->shared_from_this();
        children_.push_back(std::move(child));
    }

    std::weak_ptr<Node> getParent() const
    {
        return parent_;
    }

    std::vector<std::shared_ptr<Node>>& getChildren() const
    {
        return children_;
    }
};

这个想法是将weak_ptr存储到父级,以便不存在循环依赖关系,并将shared_ptr的 vector 存储到子Node。

main.cpp
#include <string>
#include "Node.h"

int main(int argc, char** argv) {

    std::shared_ptr<Node<std::string>> parentNode = std::make_shared<Node<std::string>>("Parent");

    std::shared_ptr<Node<std::string>> child1 = std::make_shared<Node<std::string>>("Child1");
    std::shared_ptr<Node<std::string>> child2 = std::make_shared<Node<std::string>>("Child2");

    parentNode->addChild(child1);
    parentNode->addChild(child2);

    return 0;
}

但是,在编译时出现以下错误
void addChild(std::shared_ptr<Node> child) const
{
    child->parent_ = this->shared_from_this(); // No viable overloaded '='
    children_.push_back(std::move(child)); // No matching member function for call to 'push_back'
}

感谢您的协助!

最佳答案

您的addChild成员函数不应为const才能正常工作。

fixed exmple

关于c++ - 赋予容器其子代的所有权,但让子代使用智能指针存储对其父代的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61718860/

相关文章:

c++ - 将 'this' 转换为 std::shared_ptr

c++ - std::bind 与 std::shared_ptr

c++ - 使用不同的 C++ 环境创建 DLL

c++ - 什么是 raw_storage_iterator 组件在 C++ 中的用途/优势

c++ - visual studio 2013 终极版如何在每行包含某个词的行插入断点

c++ - 非模板函数接受模板消歧器

c++ - 我应该如何将 placement new 与自定义分配 API 一起使用?

c++ - 将 'upserting' 项放入 map<key, shared_ptr<foo>> 的正确方法

c++ - 生产者/消费者实现——需要反馈

c++ - 串行监视器显示来自 Arduino Mega 的意外输入