C++ 为什么没有将此指针指定给新对象?

C++ 为什么没有将此指针指定给新对象?,c++,pointers,C++,Pointers,我定义了一个二叉搜索树类,如下所示: template <class T> class BSTNode { public: BSTNode(){ right = left = 0; } BSTNode(const T& el, BSTNode * l = 0, BSTNode * r = 0) { val = el; left = l; right = r; } T val; BSTNo

我定义了一个二叉搜索树类,如下所示:

template <class T>
class BSTNode
{
  public:
    BSTNode(){
      right = left = 0;
    }

    BSTNode(const T& el, BSTNode * l = 0, BSTNode * r = 0)
    {
    val = el; left = l; right = r;
    }   

    T val;
    BSTNode * right;
    BSTNode * left;
};

template <class T>
class BST
{
  public:
    BST(){ root = 0;}           
    void Insert(const T& el);
  private:
    BSTNode<T> * root;
};
template <class T>
void BST<T>::Insert(const T& el)
{
  bool bEqual = false;
  BSTNode<T> * p = root;

  while(p)
  {
    if(el == p->val)
    {
      bEqual = true;
      return;
    }
    if(el < p->val)
    {
      // go left
      p = p->left;
    }
    if(el > p->val)
    {
      // go right
      p = p->right;
    }
  }

  if(!p)
  {
    std::cout << "creating new node " << el << "\n";
    p = new BSTNode<T>(el);
  }  
}

为什么
root
指针变量保持在0,而不是新对象的地址?

您永远不会这样做
root=在您的代码中;另外,
p=新节点(el)泄漏内存

我猜您希望
p
成为指针的引用,因此可以更改原始指针

 BSTNode<T> *& p = root; // watch out, it won't solve anything

因为在对象的构造上

声明

  p= root
将p初始化为空指针

您创建一个新对象并将其地址传递给p而不是根


问题是p只是根的一个副本,而不是对这个指针的引用。

您不需要
root=任何地方,它为什么会改变?不,我从来没有想过
p
实际上是指针的引用。但你所说的“小心,它解决不了任何问题”是什么意思?你的意思是因为引用
p
已被实例化为
root
,并且无法重新分配吗?@BeeBand,你的原始代码假设当你执行
p=p->左;p=新节点(el)
,则原始的
p
左侧的
也将更改;该功能是引用的功能,因此您的代码假设指针实际上是指针的引用。关于你问题的第二部分:是的;您不能执行
BSTNode*&p=root;p=p->左,因为无法重新分配引用。要使原始算法工作,您必须使用指针到指针-我个人更喜欢我的方式。
  p= root