复制包含共享指针列表的共享指针后面的对象
copy object behind shared pointer containing a list of shared pointers
我有一个 shared_ptr<Tree> tree
和一个包含儿童列表的CC_1作为共享指针。
class TreeNode
{
protected:
std::weak_ptr<TreeNode> parent;
/**
A list containing the children of this node
*/
std::shared_ptr<std::vector<std::shared_ptr<TreeEdge>>> children;
...
一棵树只需要给予treenode作为根。
Tree::Tree(const shared_ptr<TreeNode> root)
: root(root)
{}
因此,要创建那个子树,我尝试获取一个treenode并用它调用树构造函数。
shared_ptr<TreeNode> treeNode = oldTree->getASpecialNode();
shared_ptr<Tree> newTree = make_shared<Tree>(treeNode);
现在newTree
的根是treeNode
。但是问题是,每个treenode都指向其父母。 treeNode
。
weak_ptr<TreeNode> TreeNode::getParent() const
{
return parent;
}
通过通过newTree
中的任何treenode的父母来计算根部时,我们将达到与newTreeNode
不同的根节点,因为newTreeNode
本身具有父母。
删除该父不是解决方案,因为该对象是共享的,我们将需要它在原始树中。因此,我看到的唯一解决方案是复制treenode并复制所有成员。
我该怎么做?
基于其他答案,因此我尝试了以下内容:
std::shared_ptr<TreeNode> TreeNode::clone() const
{
auto clone = new TreeNode (*this );
clone->setParent(weak_ptr<TreeNode>());
return shared_ptr<TreeNode>(clone);
}
,但仍在计算父母将导致原始根节点。所以我无法创建一个子树。
我觉得将shared_ptr
用于Tree
和TreeNode
是错误的,但这不是我的代码。我只需要添加一个功能。
必须克隆整个子树,而不仅仅是子根。由于没有任何指针被复制,因此复制初始化克隆没有用。另外,您应该避免向分配记忆的裸露指针,以确保强大的例外安全性。
未经测试的示例:
std::shared_ptr<TreeNode> TreeNode::clone() const
{
auto clone = std::make_shared<TreeNode>();
clone->children->reserve(children->size());
for(const auto& c : *children) {
auto c_clone = c->clone();
c_clone->setParent(clone);
clone->children->push_back(c_clone);
}
return clone;
}
我觉得将
是错误的shared_ptr
用于Tree
和TreeNode
i 分享您的感觉。当然,当节点有父母指针时,尚不清楚如何在多个树上明智地共享节点。
std::shared_ptr<std::vector<std::shared_ptr<TreeEdge>>>
似乎也过度间接。
您的克隆功能应该看起来像:
std::shared_ptr<TreeNode> TreeNode::clone() const
{
auto res = std::make_shared<TreeNode>();
for (auto child : *children) {
res->AddChild(child->clone());
}
return res;
}
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址