赋予其子容器所有权,但让子容器使用智能指针存储对其父容器的引用
Give container ownership of its children, but have children store a reference to their parent using smart pointers
我想让树中 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
的向量存储到子节点。
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 才能工作。
我想让树中 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
的向量存储到子节点。
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 才能工作。