7

C++ には、Java の弱参照に似たものがありますか? ゲーム内のオブジェクトのリスト (クラス Soldier、リストは std::list* 敵) を持っており、そこに目に見える敵兵のリストを保持しています。すべての兵士は、敵の兵士へのポインターを持つことができます ( Soldier* ターゲット; クラス内)。他の鉱山の兵士が敵の兵士を殺したときに必要なもの (その後、殺された兵士は敵のリストから削除されます) その兵士のポインターをターゲットとして持つすべての兵士は、削除されているため、null にする必要があります。私はこれを兵士のIDで解決できます。チェックするループごとに同じIDを持つ敵の兵士がいますが、力ずくのようです。これをよりエレガントな方法で解決できますか (c++11 は使用できませんか?

class Soldier{
Soldier* target;

public:
// other functions
void shootAtTarget();
};
4

4 に答える 4

14

正確な動作上の同等物がないことに注意してください。Java の弱い参照の概念は、ガベージ コレクターの存在と、一般的なマネージド メモリに大きく依存しています。C++ では、ポインタは単なるメモリ ロケーションであるため、別の何かでオブジェクトのライフサイクルを「追跡」する必要があります。

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

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

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

于 2013-05-17T16:09:43.327 に答える