带有 *&参数的递归 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 的指针?
使Left
和Right
返回引用。您正在尝试将临时值传递到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
)
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 退出c++中的递归void方法
- 递归中无效的 void 操作数
- 带有 *&参数的递归 void 函数
- 如何使用void类型处理递归回溯返回
- 带有值的递归阶乘错误返回语句,在函数中返回 'void' [-fallowive]