1

我正在做(类似的事情):

void insert(Node*& node, string val, Node* parent)
{
   if (node == NULL)
     instantiateNode(node, val, parent);
   else
     insert(node->child, val, node);
}

问题是,这instantiateNode(..., parent)似乎修改了*&node在设置*parent. instantiateNode()应该改变,但如果它改变了 ,那么你有一个节点设置为它的父节点,这没有意义,也不起作用。完全没有。nodeparent

我完全关心指针引用的原因是因为它消除了特殊情况并显着减少了我必须做的错误检查量。由于我这样做是为了减少行数和琐碎的算法重复,因此我可以通过将代码行数增加大约一倍来解决这个问题。但我宁愿不这样做,而且我觉得应该有一种方法可以取消引用指针引用以获取指向同一对象的新指针。而且,真的,我认为应该通过传递*&node*parent完成它,但显然 gcc 正在优化它。

4

3 回答 3

4

应该有一种方法可以取消引用指针引用以获取指向同一对象的新指针。

那么,这个怎么样?

Node* n = node;

现在你有一个非引用指针,它指向与节点相同的对象,正是你所要求的。

我 95% 确定您面临的问题与引用无关,而与 instantiateNode 中的错误逻辑或您对它的使用有关。这就是为什么如果您向我们提供有关代码应该做什么的更多信息,或者甚至将代码发布到 instantiateNode 会很有用。

于 2009-10-08T04:22:13.717 回答
3

node是对指针的引用,这意味着如果函数设置了node,传入的值就会改变。这就是引用的工作方式。

如果您不希望节点在调用函数中更改,请不要将其作为引用。

还是我误解了什么?

于 2009-10-07T22:59:53.890 回答
0

我认为node不需要通过引用传递。一个简单的指针应该可以完成这项工作。这是因为您不需要直接更改它。你为什么要把它传给instantiateNode()? 它将始终为 NULL,那么它有什么用呢?如果instantiateNode()它的第一个参数也作为引用传递,为什么?您正在传递父级,因此instantiateNode()只能访问node应该通过 表示的事物parent->child。即使由于某种原因instantiateNode()确实通过引用将其作为参数并且需要这样做,我相信如果您从insert()的第一个参数中删除引用,该函数仍然可以工作。instantiateNode()当函数返回时,对该值所做的任何事情都将简单地丢失。对不起,这太令人困惑了,但我想不出更好的表达方式。

您的问题有另一种解释......也许您的电话insert()应该是:

insert(node, val, node->child);
于 2009-10-07T23:08:36.960 回答