0

ここに私のコードの一部があります:

class Node{
   public:
   Node* parent;
   Node* left;
   Node* right;
   int key;
};

(...)

/*
* Ps.: v1 is parent of v2!
* and assume that v1->parent is NULL
*/
void somefunction(Node*& v1,Node*& v2){
    (...)
    v2->parent = v1->parent; // The problem is here, more details below
    (...)
}

問題は、 の引数に があるv2->parentため、を呼び出すと、コンパイラはそれが等しい(v2 の父親である) と解釈し、 に変更されますが、値を変更したいだけで、ではありません。<type>*&somefunction()v2->parentv1v1NULLv2->parentv1

PS .:<type>*&コードの下のいくつかの部分で使用する必要があります。引数の型を変更することはできません。

4

1 に答える 1

3

おそらく次のような関数を呼び出しているようです。

somefunction(v2->parent, v2);

つまりv2->parent、関数内は関数内とまったく同じオブジェクトv1です。( )に設定v2->parentすると、変更も行われます。v1->parentNULLv1

引数の型を変更することはできないとおっしゃっていますが、変更することをお勧めします。ポインタへの参照があることはかなり悪い兆候です。コードを再設計する必要があるようです。

v2->parent別の方法は、関数に渡す前にコピーすることです。

Node* v1 = v2->parent;
somefunction(v1, v2);

これで、関数のv1内部はこのコピーでv2->parentあり、元の関数を変更しません。

于 2013-03-06T23:57:07.997 に答える