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

问题描述 投票:0回答:1

我想生下所有的孩子。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的子节点。

主.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'
}

谢谢你的帮助!我想让一个树中的Node的所有子节点为其父节点所拥有,并让每个子节点存储一个对其父节点的引用。

c++ c++11 shared-ptr smart-pointers weak-ptr
1个回答
1
投票

你的 addChild 成员函数不应该是const才行。

修正了一个例子

© www.soinside.com 2019 - 2024. All rights reserved.