2012-03-14 9 views
-3

私のC++ゲームでは、ベクターに関連する問題があります。 ベクターがまだ存在するかどうかを私に知らせるコードがあれば知りたい。 例(X = Iが作成した構造):ベクトルはまだ存在しますか?

vector<x*> var; 
var.push_back(new x); 
var[5]->Pos_X = 10; 

そして今、私が欲しいもの:

delete var[5]; 

if(var[5] still exists){ 
    var[5]->Pos_X = 20; 
} 

VARのコード何ができるかは、[5]まだが存在しますか?

+13

ここでは悪いデザインが感じられます。また、「まだ存在する」と定義する。 – Griwes

+1

ポインタを格納する必要があるのはなぜですか? – Overv

+0

構造体はゲーム内のオブジェクトに使用されるためです。 –

答えて

4

あなたが実際にそれを削除した後、nullにポインタを設定した場合を除き、ベクトルでそのスロットはへのポインタが含まれているかどうかを決定するための現実的な方法はありません:あなたは、スマートポインタを格納した場合、あなたはこのようにそれを行うことができますライブオブジェクトかどうか。

だから、に必要があると思います。そして、あなたが「本当に」何かその場所のかがあったかどうかを判断するために

if (vec[5] == NULL)

をテストすることができ delete vec[5]; vec[5] = NULL;

+0

それを試してみましょう!ありがとうございます –

+0

私はあなたの質問を正しく解釈することを願っています。私はそう思う。 –

+0

はい、これはまさに私が期待したものです。ありがとうございました! –

3

あなたの削除プロセスに特別な注意を払う必要はありませんが、そのためのコードはありません。

vector<unique_ptr<x>> var; 
// assuming you actually do add 6 or more elements to the vector 
... 
var[5].reset(); 

if (var[5]) { ... } 
+2

ポインタの格納を主張する場合は、スマートポインタが必要です。 – chris

+0

私は理解して、私は何をするつもりか分かります... –

0

呼び出し削除そのx *で指されたメモリの割り当てを解除しているので、あなたはまだそれを含まないいくつかのメモリアドレスへのポインタを持っています。

ベクトルから要素を削除する場合は、「消去」を使用することを検討してください。消去したくない場合はN番目の要素を単に取り消したい場合は、構造体はあなたのものです。

+0

OK、私に例を教えてもらえますか? –

+0

ベクトル空間を割り当てたままにしておくと(アイテムを消去しないようにする)、有効なブール値を構造体に追加します。フィールドを削除したいとき(実際には無効にする):var [5] .valid = false;もう一度検証したいときは、それをtrueに設定します。実際にメモリを解放する必要がない場合は、軽い解決策です。あなたは@ Jerry Coffinが言ったことと同様に、何らかのメソッドやラッパーの内部でこのロジックをカプセル化することができます – kappa

1

var.size()を使用して、ベクターにvar[5]にポインタが含まれているかどうかを確認できますが、ポインタが有効かどうかはわかりません。

あなたは小さなラッパークラスを作成することができます。

template <class T> 
class wrapper { 
    bool valid; 
    T *data_; 
public: 
    wrapper(T *d): data_(d), valid(true) {} 
    del() { delete data; valid = false; } 
    bool isValid() { return valid; } 
    T *data() { return valid ? data : NULL; } 
}; 

std::vector<wrapper<x> > var; 

var[5].del(); 

if (var[5].valid()) 
    var[5].data()->Pos_X = 20; 

個人的に、私はすべてのポインタはしかし、すべての時間有効であることを確認することを好むだろう。

+0

私はこの作品がうまくいけることを願っています! –

+0

@TiagoSalzmann:「作品」を十分に狭義に定義しています。例えば、これらのうちの1つをコピーして、あるコピーで 'del()'を使うと、もう一方はデータが削除されたことを知らないでしょう。私はコードを編集していくつかの小さなエラーを修正しました(しかしまだテストされておらず、証明されていないので、さらにいくつかのバグがありそうです)。 –

関連する問題