具有*&的递归空函数参数

时间:2013-12-28 13:17:09

标签: c++ pointers recursion reference arguments

这个递归void函数有问题:

void ReadBinaryTree(NODE &p)
{
    char ch;
    File.get(ch);
    if (ch != '#')
    {
        NODE p = new Node;
        p->SetFreq(ch);
        ReadBinaryTree(p->Left());
        ReadBinaryTree(p->Right());
    }
    else return;
}

NODE是指向Node类的指针,File是ifstream对象。 Left()Right()返回NODE。 编译器不接受p->Left()p->Right()参数,错误是:

no know conversion for argument 1 from 'NODE {aka Node*} to 'Node *&
你可以帮帮我吗?如何在递归期间保存指向Node的指针?

3 个答案:

答案 0 :(得分:2)

设为LeftRight返回引用。您正在尝试将临时值传递给ReadBinaryTree,不要绑定到参数列表中的非const引用。

你的递归总是被打破,因为你在函数内部运行的是本地NODE p,而不是参数。也许你的意思是p = new Node;,虽然这很难说清楚。

答案 1 :(得分:0)

问题是p->Left()p->Right() r-values ,这意味着您无法引用它们。问题出现是因为p->Left()正在返回一些值(类型为Node *),而这些值正被复制到ReadBinaryTree的参数中。

要解决此问题,您的p->Left()p->Right()函数应返回NODE &个值(这样您的递归可以访问与父节点中完全相同的指针,而不仅仅是一些副本)。

此外,NODE p = new Node;应为p = new Node;

但是,我可以建议您将此函数转换为返回值的函数吗?即。

NODE ReadBinaryTree(ifstream &File)
{
    char ch; File.get(ch);
    if(ch != '#')
    {
        NODE p = new Node;
        p->setFreq(ch);
        p->Left() = ReadBinaryTree(File);
        p->Right() = ReadBinaryTree(File);

        return p;
    } else return null;
}

此代码仍需要左右访问者才能返回引用。

编辑:解释为什么参考不能采用r值

p->Left()(访问者函数)返回左指针的副本。因此,虽然该值与p->left(属性)相同,但内存中的位置不同,重要的是,p->Left()已被分配了一个临时内存位置,因为它是一个表达式,它是期望变量“投入”。通常,当您将表达式传递给函数时,它会被“放入”传入的参数,如,如果该参数是引用,它期望已经是非临时的内存位置,它采用自己的方式。因此,当您将表达式(具有临时内存位置)传递给期望引用的内容时,它会抱怨,因为它期望具有已经固定的内存位置的内容,以便采用它。

答案 2 :(得分:0)

ReadBinaryTree需要对指针的引用,以便它可以更新指针以指向新创建的对象。问题是Left()Right()只返回子节点的地址,而不是对存储地址的指针的引用。

因此,您可以更改Left()Right()的签名:

NODE Left()

为:

NODE & Left()

作为替代方案,您可以直接将存储子节点的指针传递给ReadBinaryTree

ReadBinaryTree (p->left)

(这自然假设Node中有一名成员left