C++参考问题

C++ Reference Issue

本文关键字:问题 参考 C++      更新时间:2023-10-16

我最近问了一个关于在C++11中创建类的正确方法的问题。我通过建立一个Tree课程进行练习,并收到了一些很棒的建议。然而,我在理解为什么我的代码不起作用时遇到了一点困难。

特别是,我很难理解为什么我的insert方法不能正常工作。

template<typename T>
class Tree {
private:
  struct Node {
    T data;
    Node* p_left;
    Node* p_right;
  };
  Node* newNode(T data) { return new Node {data, nullptr, nullptr}; }
  Node* root_;
  //Other functions, etc... (copy constructor and copy assignment operator)
public:
  void insert(T const data) {
    Node*& root = root_;
    while (root != nullptr) {
      root = (data <= root->data ? root->p_left : root->p_right);
    }
    root = newNode(data);
  }
  Tree(): root_(nullptr) {}
  //Other constructors, functions, etc...
};

如果我创建一个新的Tree对象,然后用一些数据填充该对象,那么该对象只保留最后一段插入的数据。我知道我在某个地方搞砸了,因为我的指针引用,但我不知道在哪里。任何正确方向的建议都将不胜感激。

两个问题。。。首先,在第一次插入树时,您没有更新root:

if (root == nullptr) { return newNode(data); }

事实上,即使insert函数返回void,也会返回新节点。如果您完全删除了这一行,代码应该可以工作。如果rootnullptr开始,则while循环将被跳过,并且root将被更新为新节点。

第二个问题是,您使用的是对Node指针的引用,这意味着每次创建新节点时都要移动Tree的root_。这不一定是个好主意。就我个人而言,我会这样写:

void insert(T const data) {
    Node** proot = &root_;
    while (*proot != nullptr) {
        proot = (data <= (*proot)->data ? (*proot)->p_left : (*proot)->p_right);
    }
    *proot = newNode(data);
}