0

したがって、次の型の保護されたポインターメンバーを持つクラスがあります

int *assigntoThis; // In the constructor I have initialized this to NULL.

次の宣言を持つ同じクラスのパブリック再帰メンバー関数もあります

bool find(int* parent, std::string nameofnode, int* storeParentinThis);

再帰関数は子ノードをチェックし、子ノードの名前がパラメーターとして渡された文字列と一致する場合、親のアドレスを storeParentinThis に割り当てます。

これは、同じクラスの別の関数から関数を呼び出す方法です。

bool find(root, "Thread", assigntoThis);

ただし、実行時に assigntoThis に格納されている値を出力すると、00000000 = NULL になります。再帰関数内で assigntoThis の値を変更するにはどうすればよいですか?

4

1 に答える 1

3

への変更 :

bool find(int* parent, std::string nameofnode, int*& storeParentinThis);

説明:

元のコードの簡略版は次のとおりです。

foo (int* p) { /// p bahaves as a local variable inside foo
  p = 1;  
}    
int* p = 0;
foo(p);
// here p is still equal 0

これは実際には次のコードに似ています。

foo (int i) {
  i = 1;  
}    
int i = 0;
foo(i);
// here i is still equal 0

の方がわかりやすいと思います。

したがって、関数から何かを返したい場合は、それへのポインターまたは参照を作成する必要があります。例を逆にたどります。

foo (int* i) { // pointer example
  *i = 1;  
}    
int i = 0;
foo(&i);
// here i is equal to 1

foo (int& i) { // using reference example
  i = 1;  
}    
int i = 0;
foo(i);
// here i is equal to 1

これで、ケースに簡単に適用できます。

// pointer example
bool find(int* parent, std::string nameofnode, int** storeParentinThis) {
    *storeParentinThis = parent;
}

// reference example
bool find(int* parent, std::string nameofnode, int*& storeParentinThis) {
     storeParentinThis = parent;
}
于 2012-07-11T18:13:49.230 に答える