我知道你通常应该使用shared_ptrs和weak_ptrs来使循环引用自行解决,但是我发现一种不同的方法适用于我的用例并且想知道以下是否可以以及它是否有任何市长缺点
基本上,我实现了一个双向链接树,如下所示:
class TreeNode{
public:
TreeNode();
TreeNode(shared_ptr<TreeNode> parent);
void addChild(TreeNode);
private:
shared_ptr<TreeNode> parent_;
vector<TreeNode> children_;
}
TreeNode::TreeNode() :
parent_(shared_ptr<TreeNode>(nullptr)),
children_(vector<TreeNode>())
{}
TreeNode::TreeNode(shared_ptr<TreeNode> parent) :
parent_(parent),
children_(vector<TreeNode>())
{}
TreeNode::addChild(TreeNode child){
child.parent_ = shared_ptr<TreeNode>(this);
children_.push_back(child);
}
因为我知道TreeNode
总是必须有父母(当然除了根),shared_ptr
的引用计数似乎与我无关,因为父母总是会比指向它的子节点包含它,所以我甚至可能在这一点上使用原始指针。
此外,我不需要孩子们的指针,因为允许使用不完整类型的模板。
1。这种方法是否与任何C ++约定相矛盾,如果循环引用总是使用共享和弱指针完成,无论如何?
2。让父母成为一个原始指针是危险的,如果是,为什么?