C ++参考问题

时间:2014-09-01 02:46:00

标签: c++ class pointers reference

我最近问了一个关于正确的方法的问题,以便在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对象,然后使用某些数据填充该对象,则该对象仅保留最后一条插入的数据。因为我的指针参考,我知道我在某处乱搞,但我无法弄清楚在哪里。任何正确方向的提示都会非常感激。

1 个答案:

答案 0 :(得分:0)

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

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

实际上,即使insert函数返回void,您也将返回新节点。如果你完全删除该行,代码应该工作。如果rootnullptr开头,则会跳过while循环,root将更新为新节点。

第二个问题是您正在使用对节点指针的引用,这意味着每次创建新节点时都会移动树的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);
}