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*parentinstantiateNode()nodeparent

私がポインター参照に悩まされているのは、それによって特殊なケースが排除され、実行しなければならないエラー チェックの量が大幅に削減されるためです。行数と単純なアルゴリズムっぽい重複を減らすために行っているので、コード行数を約 2 倍にすることでこれを回避できます。しかし、私はむしろそうしたくないので、同じオブジェクトを指す新しいポインターを取得するためにポインター参照を逆参照する方法が必要だと感じています。*&nodeそして、本当はパス オブスルー*parentでやるべきだと思っていたのですが、どうやら gcc が最適化しているようです。

4

3 に答える 3

4

ポインター参照を逆参照して、同じオブジェクトを指す新しいポインターを取得する方法が必要です。

さて、これはどうですか?

Node* n = node;

これで、ノードと同じオブジェクトを指す非参照ポインターが得られました。まさにあなたが求めていたものです。

あなたが直面している問題は参照とは何の関係もなく、instantiateNode のロジックの欠陥またはその使用に関係していると 95% 確信しています。そのため、コードが何をすべきかについての詳細情報を提供していただくか、instantiateNode にコードを投稿していただけると助かります。

于 2009-10-08T04:22:13.717 に答える
3

node はポインターへの参照です。つまり、関数が node を設定すると、渡された値が変更されます。それが参照の仕組みです。

呼び出し関数でノードを変更したくない場合は、参照にしないでください。

それとも私は何かを誤解していますか?

于 2009-10-07T22:59:53.890 に答える
0

node参照渡しする必要はないと思います。単純なポインターがその仕事をするはずです。これは、直接変更する必要がないためです。なぜに渡すのinstantiateNode()ですか?常に NULL になるので、何の役に立つのでしょうか? instantiateNode()最初の引数も参照として渡されている場合、なぜですか? 親を渡しているので、を介して表す必要instantiateNode()があるものにアクセスできます。何らかの理由で参照によってパラメーターを取得し、そうする必要がある場合でも、の最初の引数から参照を削除しても、関数は機能すると思います。その値で何をしても、関数が戻ると単に失われます。わかりづらくて申し訳ありませんが、これ以上の言い方が思い浮かびません。nodeparent->childinstantiateNode()insert()instantiateNode()

あなたの問題には別の解釈があります...おそらくあなたの呼び出しは次のようになるinsert()はずです:

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