创建对返回的指针的引用

时间:2018-08-11 18:56:06

标签: c++ function pointers

我有一个从NodeInterface继承的节点类,它具有两个函数NodeInterface * return(Left / Right)Child()。这是一个类,我们必须遵循此NodeInterface。

我正在尝试为BST创建add()函数,并且需要将当前节点传递给递归add函数作为参考。

bool add(T data) {
    return addNodeToNode(data, root);
};

bool addNodeToNode(T data, NodeInterface<T>*& cNode) {
    if ((cNode) == nullptr || cNode == NULL) {
        (cNode) = new Node<T>(data);
        return true;
    }

    int nodeData = (cNode)->getData();
    if (data == (cNode)->getData()) return false;
    if (data < nodeData) {
        addNodeToNode(data, cNode->getLeftChild());
    }
    if (data > nodeData) {
        addNodeToNode(data, cNode->getRightChild());
    }
    return true;
};

但是我一直收到错误C2440:'正在初始化':当我调用addNodeToNode(data, cNode->getLeftChild());addNodeToNode(data, cNode->getRightChild());时无法从'NodeInterface *'转换为'NodeInterface *&'

这让我感到非常困惑,因为root是指向NodeInterface对象的指针,并且add(T data)函数在第二个参数为root的情况下调用addNodeToNode没问题。

1 个答案:

答案 0 :(得分:1)

您试图将非const左值引用传递给不合法的临时(函数调用的返回值)。一种解决方案是创建采用r值引用的addNodeToNode重载,另一种解决方案是使您的getLeftChild / getRightChild返回引用对指针而不是仅返回指针(这样,您将对存储在节点中的实际指针进行引用)对象)。

但是,老实说,尝试让cNode担当输入节点对象的双重角色,并输出一个新创建的节点,这使我感到非常糟糕。如果您将cNode设置为仅输入(因此放弃了对其进行引用的要求)并设置了addNodeToNode的返回值,则实现BST的新节点对象将容易得多。