2011-12-20 4 views
0

私はreset()のデータを束ねてリセットします。これらのうちの1つは、カスタムクラスへのポインタです。Apple *aとしましょう。親ポインタが割り当てられているかどうかをテストするには?

vector<Seed *>クラスには、オブジェクトを持ち、すべてをクリアしてリセットするメソッドresetSeeds()があります。

aが割り当てられる前にreset()が呼び出された場合、これらはまだ割り当てられていないので、私は、resetSeedsはそのSeedオブジェクトを反復処理する必要はありません。これはどうすればいいですか?

+1

'* a'を' NULL'に初期化します。また、 'a'は割り振られていなければリセットするための「シード」を持たないでしょう。 – Joe

+0

'a'の型が' Apple * 'で、割り当てられる前に有効なオブジェクトを指していないので、'ベクトル 'はまったくリセットされません。 'a'を' nullptr'に初期化すると、割り当てられていないものを見つけるのは簡単です。 – Chad

答えて

1

まず、aをNULLに設定します。

class Foo 
{ 
private: 
    Apple* a; 

public: 
    Foo() : a(NULL) { } 

    void reset() 
    { 
     if (a != NULL) { 
      a->resetSeeds(); 
     } 
    } 
}; 

あなたがC++ 11を使用している場合は、nullptrの賛成でNULLを切り替える:aがNULLでない場合はその後、reset()で、唯一a->resetSeeds()を呼び出します。

1

初期化リストでポインタを初期化します。その宣言にNULL

class Worm 
{ 
     Apple *a; 
     Worm() : a(0) 
     { 
      // a is 0 
     } 

     void setApple(Apple *_a) 
     { 
      a = _a; 
     } 

     void eat(void) 
     { 
      if(a) 
       a->chew(); 
     } 
} 
0

設定a、または関連するコンストラクタで、それはインスタンスフィールドだ場合、あなたはそれを使用する前にNULLをチェック:それそれはでも、コンストラクタを呼び出す前に設定しています方法。

到達可能な無効なポインタNULLを保持し、使用する前にNULLのポインタを確認することをお勧めします。

関連する問題