繁体   English   中英

使用Boost的shared_ptr和weak_ptr构造树

[英]Constructing a tree using Boost's shared_ptr and weak_ptr

这是正确的方法,对左右节点使用boost::shared_ptr ,对根节点使用boost::weak_ptr 我知道分享是一个过分的杀伤力。 我稍后将需要它。

节点类,2个儿子共享ptr

class Node
{
public:
boost::shared_ptr<Node> left;
boost::shared_ptr<Node> rigth;
int nVal;
Node();
Node(int);
~Node();
Node getVal(void);
void setVal(int);

};

Node::Node()
{
cout << "creating node empty" << endl;
nVal = 0;
left.reset();
rigth.reset();

}

Node::~Node()
{
cout << "entering destructor" << endl;
 }

Node::Node(int n)
{
cout << "creating node with value" << endl;
nVal = n;
left.reset();
rigth.reset();
}

Node Node::getVal(void)
{
cout << "returning value" << endl;
return this;
}

void Node::setVal(int n)
{
cout << "setting value" << endl;
nVal = n;
}

类树,弱ptr

class Tree 
{
public:
boost::weak_ptr<Node> root;
Tree();
~Tree();
void findParent(int n, int &found, Node &parent);
void add(int n);
void post(boost::weak_ptr<Node> q);
void del(int n);

};

Tree::Tree()
{
root = NULL;
}

您不应该对这样的节点使用弱指针。 弱指针意味着即使没有其他弱指针可以使用该对象,也可以删除该对象。

因此,在您的情况下,您只有一个指向根的弱指针,而没有共享指针。 在这种情况下,根目录将被删除,因为没有共享指针使该根目录保持活动状态,并且所有树都将消失。

一般规则是,共享指针应用于所有权关系。 树肯定拥有自己的根。 另一方面,应使用弱指针作为指向直接或间接父对象的后向指针,以突围。 因此,如果您的节点指向根,则可以使用弱指针。

确保的最佳方法是首先尝试使用共享指针,并注意不要在依赖项中建立任何圆圈。 仅当必须中断一个圆圈时,才根据所有权/反向指针的差异将共享指针更改为弱指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM