BinaryNode *&

时间:2017-04-18 06:18:48

标签: c++ pointers reference

以下是我将元素插入二叉搜索树的代码。 insert函数有两个参数,value是要插入树的数字和root,它是树的根。

我的root->getLeft()root->getRight()都返回BinaryNode*,这就是为什么我认为它会返回此错误:

BST.cpp: In function ‘void insert(int, BinaryNode*&)’:
BST.cpp:72:34: error: invalid initialization of non-const reference of type ‘BinaryNode*&’ from an rvalue of type ‘BinaryNode*’

void insert(int value, BinaryNode*& root) {
        cout << "Looping" << endl;
      if(root == NULL) {
        BinaryNode* node = new BinaryNode(value);
        root = node;
        cout << "finalized" << endl;
        cout << "Root value: " << root->getValue() << endl;
      }
      else if(value < root->getValue()) {
          insert(value, root->getLeft());
          cout << "went to left" << endl;
      }
      else if(value >= root->getValue()) {
          insert(value, root->getRight());
          cout << "went to right" << endl;
      }
    }

如何修改root->getLeft()以便传入正确的值(*&amp;)?

此外,*&amp;意思?我一直在测试只传入BinaryNode* root,对root的更改似乎永远不会生效,例如root忘记了它在insert之外的值,而在过去只有*&amp;似乎努力改变原始的实际价值。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是C ++语言中的一条规则:You can not bind a r-value to l-value reference

考虑这个例子:

// Foo return a r-value
some_type foo();

// binding r-value to l-value reference is not valid
some_type& var = foo();

在这个例子中,我们从foo返回一个临时对象,该对象在表示返回的赋值时将被销毁,因此我们将有一个悬空引用。这就是为什么你不能将r值绑定到l值引用。

在您的代码中root->getLeft()返回类型为BinaryNode*的r值,然后将其绑定到BinaryNode*&,这是一个l值引用。

即使您可以绕过该错误,您的代码也会出现问题:root->getLeft()返回一个临时变量指针,然后在insert函数中通过它BinaryNode*& root更改临时指针参数。您应该从(BinaryNode*&)getLeft()返回对节点指针getRight()的引用。