繁体   English   中英

带*和参数的递归void函数

[英]Recursive void function with *& parameter

我有这个递归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的指针?

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

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

问题是p->Left()p->Right()r值 ,这意味着你不能引用它们。 问题出现是因为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()已被分配了一个临时内存位置,因为它是一个表达式,它是期望变量“投入”。 通常,当您将表达式传递给函数时,它会被“放入”它传入的参数中, 如果该参数是引用,则它期望已经存在非临时内存位置,它将其用作它自己的。 因此,当您将表达式(具有临时内存位置)传递给期望引用的内容时,它会抱怨,因为它期望具有已经固定的内存位置的内容,以便采用它。

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

所以你可以改变Left()Right()的签名:

NODE Left()

至:

NODE & Left()

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

ReadBinaryTree (p->left)

(这自然假设在Node有一个名为left的成员)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM