Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;参数1从‘;节点*’;至‘;节点*&’;_C++_Pointers_Binary Search Tree_Pass By Reference - Fatal编程技术网

C++ C++;参数1从‘;节点*’;至‘;节点*&’;

C++ C++;参数1从‘;节点*’;至‘;节点*&’;,c++,pointers,binary-search-tree,pass-by-reference,C++,Pointers,Binary Search Tree,Pass By Reference,我试图使用递归函数将节点插入到二叉搜索树中。然而,当我试图调用我的函数时,我得到了错误消息 no known conversion for argument 1 from ‘Node*’ to ‘Node*&’ 这是递归函数及其调用函数的代码: bool BST::add(int data) { if (root == NULL) { Node* gnu = new Node(data); root = gnu; retu

我试图使用递归函数将节点插入到二叉搜索树中。然而,当我试图调用我的函数时,我得到了错误消息

no known conversion for argument 1 from ‘Node*’ to ‘Node*&’
这是递归函数及其调用函数的代码:

bool BST::add(int data)
{
    if (root == NULL)
    {
        Node* gnu = new Node(data);
        root = gnu;
        return true;
    }
    return recursiveAdd(root, data);
}

bool BST::recursiveAdd(Node*& start, int data)
{
    if (start == NULL)
    {
        Node* gnu = new Node(data);
        start = gnu;
        return true;
    }
    if (data < start->getData())
    {
        return recursiveAdd(start->getLeft(), data);
    }
    if (data > start->getData())
    {
        return recursiveAdd(start->getRight(), data);
    }
    if (data == start->getData())
    {
        return false;
    }
    return false;
}
如果有人能告诉我需要修复什么才能使它正常工作,我将非常感激


谢谢

访问器返回内部指针的副本

Node* Node::getLeft()
{
    return leftChild;
}

Node* Node::getRight()
{
    return rightChild;
}
但是
recursiveAdd
需要能够修改结构

start = gnu;
这些方法不兼容,您很幸运被编译器捕获。您可以更改
getLeft()
getRight()
以返回引用,也可以捕获由
recursiveAdd()
进行的结构更改,并使用mutator进行传播

Node* theLeft = start->getLeft();
bool did_insert = recursiveAdd(theLeft, data);
start->setLeft(theLeft);
return did_insert;
或者,正如马特所说,你可以把
recursiveAdd
当作朋友,然后就这样做

return recursiveAdd(start->leftChild, data);

不能将临时变量(getLeft和getRight返回的副本)与非常量左值引用绑定,因此会出现错误

无论如何,您不需要修改指针本身。我建议您重写您的算法,使其在没有这种奇怪且容易出错的要求的情况下工作

...
    if (root == NULL)
    {
        Node* gnu = new Node(data);
        root = gnu;
        return true;
    }
    return recursiveAdd(root, data);
}
块范围。如果
root
为空,那么最后将不会在块外声明
root
。这意味着将使用无效参数调用
recursiveAdd()
;这无法编译,否则它将始终有机会产生未定义的行为

不管怎样,由于
根目录
将过期,引用也将过期,因为引用将指向临时对象。这是不正确的,因为引用不能绑定到临时对象——根据定义,它们将指向“值的容器”,在C++11术语中通常称为左值。


也有右值,但这超出了问题的范围。

我要补充的是,有
getLeft
getRight
返回引用是毫无意义的,而且将
leftChild
righchild
公开(或者让BST成为节点的朋友)会更简单如何在不修改至少一个指针的情况下修改树的结构?@Ben Voigt With setters?@Ben Voigt是的,我的意思是通过引用直接修改它。你应该使用你正在使用的类提供的接口。更仔细地考虑生命周期。
...
    if (root == NULL)
    {
        Node* gnu = new Node(data);
        root = gnu;
        return true;
    }
    return recursiveAdd(root, data);
}