2013-05-17 17 views
7

Javaの弱い参照に似たC++がありますか? 私はゲーム内のオブジェクトのリストを持っています(クラスSoldier、リストはstd :: list * enemyです)。ここには目に見える敵の兵士のリストがあります。私の兵士はすべて、敵の兵士(Soldier * target;内部クラス)へのポインタを持つことができます。他の鉱山の兵士が敵の兵士を殺したときに必要なもの(殺された兵士が敵のリストから取り除かれたとき)兵士のポインタを持っている私の兵士は、 私はこのことを兵士のIDで解決することができます。そして、すべてのループで同じIDを持つ敵の兵士がいることを確認することができますが、それは無理な力のようです。私は、私は、正確な行動equivelentがないことを++ 11?C++にJavaの弱参照に類似したものがありますか?

class Soldier{ 
Soldier* target; 

public: 
// other functions 
void shootAtTarget(); 
}; 
+1

http://en.cppreference.com/w/cpp/memory/weak_ptr –

+0

C++について11。 IIRC std :: weak_ptrもtr1に含まれています。それ以外にboost :: weak_ptrがあります。他のすべてが失敗したら、私はブーストコードを見て、インスピレーションを受けます。 – FuleSnabel

答えて

13

注cを使用することはできません(もっとエレガントな方法でこれを解決することができます。Javaの弱参照概念が本当にそこには、ガベージコレクタであることに依存している、とでメモリを管理しますC++では、ポインタは単なるメモリ位置であるため、オブジェクトのライフサイクルを「追跡」する必要があります。

Javaでは、すべてのメモリがガベージコレクタによって管理されているため、オブジェクトがいつ削除されるかを知ることができます。C++では、ポインタ自体が単なる数値なので、ライブラリの使用がなければこれは起こりません。

同様の動作を得るにはstd::weak_ptr(またはtr1::weak_ptr)を使用できるはずです。これは、生のポインタの代わりにオブジェクトをstd::shared_ptrに格納する必要があります(とにかく良い考えです)。

C++ 11を使用できない場合、boost::weak_ptrboost::shared_ptrでC++標準ライブラリの代わりに使用できます。

+0

彼はC++ 11を使うことはできないと言った。 – SubSevn

+0

@SubSevn私は別の方法も提供しました –

+2

[これはSTLではなく、C++標準ライブラリです](http://kera.name/articles/2010/08/it-is-not-called-the-stl-mmkay/ )。 – Angew

1

各兵士がその兵士を対象とする兵士のリストを持っている場合、兵士が死んだときに目標をクリアすることができます。ターゲットを絞った兵士が別のターゲットを獲得しようとすることもできます。

1

weak_ptr(他の回答で示唆されているように)ユーザができないので、ターゲットが他の兵士で死んでいる(または割り当てられていない/ null)かどうかを確認し、それに応じてあなたが明示的にチェックをしなければならない場合を除いて、weak_ptrは論理的な観点からあなたを与えてくれました。

C++ 11に移行できない限り(良い考えです)。または別の答えで述べたように、ブーストバリアントを使用してください。

関連する問題