2

私はC++で比較的大きなプロジェクトを書いていますが、オブジェクトの削除に問題があります。プロジェクトは、正確には、ローグライクゲームです。

Npcゲーム内のすべてのモンスターであるクラスがあります。Storage<Npc>それらは、それらの管理(ロード、保存、作成、削除など)を担当する別のクラスで作成および保存されます。モンスターが死ぬたびに、対応するオブジェクトnpcを削除して完全に破壊する必要があります。オブジェクト自体を削除することは問題ではありません。私はからメソッドを呼び出すだけStorage<NPC>です。問題は、コードにこのすでに死んnpcでいるポインタへのポインタがたくさん含まれていることです。これらのポインタは現在無効であり、それらを使用しようとすると多くの問題が発生します。例えば:

  1. 彼が死ぬ前に彼が実行しようとした行動があるかもしれません。
  2. 彼がレコードに立っていたタイルには、彼へのポインターが保存されています。
  3. 彼は誰かと格闘するなど、いくつかの継続的な活動に関与していた可能性があります。

コードにはそのようなポインタがたくさんあるので、それらを単純に追跡することはほぼ不可能です。私が必要としているのは、annpcがすでに死んでいて、そのアドレスに実際のオブジェクトが格納されていないことを確認する方法です。これにより、このポインターがまだあるコードの部分が、彼の死に適切に反応できるようになります。

私自身、いくつかのアイデアを思いついたのですが、これまでのところ、どれも私には本当に良いとは思えません。

  • Storage<NPC>そのようなアドレスにオブジェクトがあるかどうかをクラスに尋ねることができます。潜在的な問題は、オブジェクトの削除後、同じアドレスに別のオブジェクトが割り当てられ、バグが発生する可能性があることです。
  • 無効なポインタを使用している可能性のあるすべての場所に通知できました。そのような場所の数は時間の経過とともに増加し、これを行うのは苦痛なので、それは悪い考えです。
  • スマートポインタのいくつかのバージョンを実装することはできますが、どれを使用するかがわかりません。

tl; drバージョン:ポインタがオブジェクトを指しているのか、メモリの空きチャンクを指しているのか、または元のオブジェクトの削除後に割り当てられた他のオブジェクトを指しているのかを教えてくれるソリューションが必要です。

4

3 に答える 3

3

あなたが提供した情報で、私が提案できるのはObserver Patternを実装することです。NPC の死に対応する必要があるコードがある場合は、このパターンが適しています。NPC へのポインター参照を含むコード セクションは、NPC の終了時に通知され、NPC へのポインターのコピーを無効にし、必要に応じて NPC の終了に反応します。死亡通知はobservers、NPC が実際に削除される前に全員に送信されます。

このパターンでは、「倒したモンスターごとにヒーローが 50 HP を獲得する」などのメカニズムを実装でき、簡単に拡張できます。

shared_ptrまた、NPC の死に積極的に反応するコードがなく、NPC が死んだ場合を処理する必要がある場合に使用するという Kevin Ballard の提案を使用することもできます。

于 2012-09-12T11:19:51.430 に答える
2

弱いポインターを使用するのはどうですか? Npcを a std::shared_ptr(C++11、std::tr1::shared_ptrC++03 に使用) にstd::weak_ptr保存するstd::tr1::weak_ptrと、shared_ptr. がshared_ptr実際にそのオブジェクトを削除すると、すべてweak_ptrの がこれを理解できるようになります。

Npc他の場所でまだ使用されている (たとえば、まだアクションがある) をなぜ削除するのか疑問に思う必要があります。これらの他のすべての参照に を削除したことを発見させる代わりに、すべての参照が消えNpcたら を終了させたい場合は、 aを単独で ( なしで) 使用すると正しく動作します。Npcshared_ptrweak_ptr

于 2012-09-12T11:10:49.343 に答える
0

1 つのオプションは、クラスに参照カウントを含めることです。他のオブジェクト (部屋など) が npc へのポインターを保持する場合、部屋には npc の参照カウントを増やす責任があります。ここで、死んだ npc を削除するだけでなく、(適切なフラグがまだない場合は別の新しいデータ メンバーを介して) 死んだというフラグを立て、参照カウントがゼロの場合にのみ削除します。部屋オブジェクトには、そのフラグを定期的にチェックする責任もあり、npc が死んでいることを知ると、その参照カウントを減らします (カウントがゼロになった場合、事後削除が発生します)。

于 2012-09-12T11:24:20.697 に答える