带有 *&参数的递归 void 函数

Recursive void function with *& parameter

本文关键字:递归 void 函数 参数 带有      更新时间:2023-10-16

我对这个递归的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中,这些值不会绑定到参数列表中的非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)