2016-09-01 11 views
0

私は初心者(!)の演習に取り組んでいます。関数呼び出しに関するポインタの問題

私は基本的な変数を渡すのが快適で、&の可変パラメータも使用していますので、返すときに破棄されない変数に変更を加えることができます。しかし、まだポインタを学んでいます。私は基本的なミュータントバニーの演習(リンクリストの練習)に取り組んでいます。

私はクラスバニーを宣言してリンクリストを作成します。私はあなたがデータセクションとリンケージを設定するための '次の'ポインタで期待通りにそれを設定しました。

Bunny* add_node (Bunny* in_root){} 

これはノードを設定し、私がしたいだけのようにそれを返します:私は機能を使用して作成したバニーのようなものを行うための関数を呼び出すとき

struct Bunny { 
    string name; 
    int age; 
    // more variables here 
    Bunny* next; 
}; 

すべてが素晴らしい作品。私はバニーの老化のようなBunnyクラスを修正する関数を呼び出すようなことも行うことができます。

void advanceAge (Bunny* in_root){} 

は、私は頭を渡し、その後、私はと呼ばれる機能でウサギを変更することができ、それがメインに戻っても、それが修正されたままになります。たとえば、私は以下を使用することができます:

in_root->age ++; 

呼び出された関数では、私は 'main'に戻っても変更されます。基本的に私は任意の呼び出された関数で - >を使用することができ、永久に変更を行います。私はポインタが逆参照されるので(?) - >しかし、まだ私の頭の周りを取得していると思う...

これまでのところとても良い。

問題を解決するには、関数を呼び出してリストを削除する必要があります。 (核オプション...ウサギはもうありません)

呼び出された関数内のすべてのノードを削除できますが、 'main'内のBunnyは変更されません。たとえば、...これはノードを永久に削除しません。

void DeathCheck(Bunny* in_root){ 
    Bunny* prev_ptr; 
    prev_ptr = in_root; 
    if (prev_ptr == NULL){ 
     cout << "No list to check age." << endl; return; 
    } else {   
prev_ptr = NULL; // <- what could I code to have this stick?  return;} 
// rest of DeathCheck 

呼び出された関数でノードをNULLに設定して固執する方法があるのではないかと思いますか?

+0

詳細を入力する必要があります。どのようにadd_node()が動作するのか。そして、どこで正確に、どのように、ウサギのリスト全体が保存されているのですか?あなたがあなたがadd_node()でやっていると思っていることをしていないかもしれないという合理的な機会があります。 –

答えて

1

in_rootを値渡ししているので、発信者の変数を変更する方法はありません。それを参考にして渡すことができます。

void DeathCheck(Bunny* &in_root) { 
    Bunny *prev_ptr = in_root; 
    ... 
    in_root = nullptr; 
    return; 
} 
+0

それは動作します!ありがとう、私は理解する。 :) – Marc

0

現在、DeathCheck(Bunny* in_root)で、in_rootを変化させることができる方法はありません、それが指しているオブジェクトのみを変更することができます。 (pass by reference and value with pointersを参照)。これに基づき、次のパスで、このにあなたの関数のシグネチャを変更することにより、例えば、参照、パラメータを変更する必要があります。

DeathCheck(Bunny* &in_root) 
{ 
    //... 
} 

これは、それが今なしに再割り当てすることができることを意味し、参照することによりBunnyを渡しますコピー。

+0

それは動作します!ありがとう、私は理解する。 :) – Marc

関連する問題