初始化在构造函数中实现自身的类模板

时间:2016-12-10 23:01:26

标签: c++ templates stl

我对使用模板和STL很新。仍然在做我的研究,但遇到了一个我很难理解的课程。我发现了TreeNode implementation我想修补但我在初始化对象时遇到了问题。

在构造函数中,其中一个参数是对自身的引用。但是,如果它从未被创建过,那么你如何将引用传递给父节点?

TreeNode(TreeNode<T>* parent, T data);

任何方向都会很好。我想更多地了解这个结构。

由于

1 个答案:

答案 0 :(得分:1)

似乎第一个参数是指向父节点的指针。 (不仅因为参数的名称是parent,还因为它在linked implementation中的使用方式,例如,请参阅方法addChild,将此参数设置为this。)

因此,构建树的根应该在父母的位置有一个nullptr

TreeNode<int>* root = new TreeNode<int>(nullptr, 42);

随后,可以添加其他节点作为现有节点的子节点:

TreeNode<int>* leftChild = new TreeNode<int>(root, 17);
TreeNode<int>* rightChild = new TreeNode<int>(root, 37);
TreeNode<int>* rightGrandChild = new TreeNode<int>(rightChild, 64);

生成树:

tree

顺便说一下,链接实现提供了方法getChildaddChild,用于获取/添加现有节点的子节点。使用这两个,上面的树可以构造如下:

TreeNode<int>* root = new TreeNode<int>(nullptr, 42);
root->addChild(17);
root->addChild(37);
root->getChild(1)->addChild(64);   // add to root's child[1]
恕我直言,似乎缺少一种构造根树的方法而不暴露底层实现(即,将指针带到父节点的类构造函数)。我建议将构造函数设为私有并添加静态方法:

template <class T>
static TreeNode<T>* TreeNode<T>::makeRoot (const T& data) {
  return new TreeNode<T>(nullptr, data);
}

使用它,可以使用TreeNode作为ADT构建上述树:

TreeNode<int>* root = TreeNode<int>::makeRoot(42);
root->addChild(17);
root->addChild(37);
root->getChild(1)->addChild(64);   // add to root's child[1]