2012-05-03 10 views
0

私のプログラムでitemsの管理方法を理解しようとしています。私はitemがどこにあるかを知っている統一されたinventoryシステムを持っていたいと思っています。次に、containerのオブジェクトを実際にインベントリしたitemsを持っていて、すべてcontainer idで見つけられます。複数の場所で参照されるオブジェクト

私の考えはboost::ptr_vetors内部containers内部に保持itemsを持って、その後、inventoryオブジェクトの内部ハッシュテーブル内のポインタ(おそらく同じもの)を保持するために、今inventoryの面で周りのものをシフトすると、そのちょうど簡単ですました単一の値を変更すること、そして物をcontainerXからcontainerに移動することは、ただ1つのポインタベクトルから削除し、それを他のコンテナに渡すこと、または1つのすべての作業を1つのcontainer、または別のもので行うことです。

私が問題を抱えているという問題は、すべてのものを取り出す時が来たときです。私は本当に一度に1つの場所に複数のポインタ/オブジェクトを保持することに取り組んできましたが、すでに削除されているものを削除しようとすると、少なくともクラッシュすることになります。まず、containersからすべての参照を削除し、それでもinventoryに存在させてから、ステップスルーしてinventoryを削除することです。これは実現可能か、それともこの権利を考慮していないのですか?これを再考する必要がありますか?もし私がただ一つのものを取り除く必要があるのであれば(残っておいてください)?

どちらの場合でもポインタの検証を解除することが心配です。

+0

(C++ 11またはBoostで)スマートポインタのベクトルを使用してみませんか?ポインタを削除する必要がないかどうか気にする必要はありません。しかし、私はあなたの問題を理解していないと思う... – Uflex

答えて

0

これを行うにはいくつかの方法があります。

  1. 標準ベクトルとboost::shared_ptrまたはstd::shared_ptrを使用してください。あなたがそうしないと、 は削除を心配する必要があり、メモリは徐々に解放されます。 ポインタがオブジェクトを参照していないときはいつでも。これは、特定のオブジェクトを頻繁に破棄し、最小限のコードしか必要としない場合に便利です。多くのオブジェクトが他のオブジェクトとは別に破壊されることはなく、多くのオブジェクトがある場合、下側はストレージ オーバーヘッドです。また、オブジェクトを削除する場所によっては、コンテナなしでもインベントリ内に存在することがあります。逆もまた同様です。
  2. 在庫を破棄したり、別のクラスでラッピングしたりすることにより、在庫を破棄したり、デインデックスしたりする責任を容器に与えます。各オブジェクトのポインタは、あなたの説明どおりに1つのコンテナにしか表示されないので、インベントリだけが余分なポインタを保持することがあります。したがって、オブジェクトを削除するときはいつでも、コンテナはインベントリをルックアップして、破壊しようとしているオブジェクトへのポインタを削除する必要があります。オーバーヘッドはインベントリの簿記です。
  3. すべてのオブジェクトへのポインタを格納するコンテナであり、自身が破棄されたときの破棄を担当するメモリプールを使用します。メモリプールはboost::ptr_vectorですが、他のコンテナは標準ベクトルです。これは、システム内のオブジェクトの頻繁な追加およびクエリに有効です。欠点は、メモリプールがコンテナと在庫を失うことがないことです。それ以外の場合は、個々のオブジェクトを残りの部分とは別に破壊する必要がある場合は、(2)のような簿記を行う必要があります。
0

Boost::ptr_vectorは、あなたがそれを渡すオブジェクトの所有権を前提としています。あなたはそれが自動的に削除されますそのベクトルからオブジェクトを削除する場合。ただし、組み込みのauto_typeを使用してアイテムを削除せずに削除できます(使用方法については、ファームヤードの例を参照してください)。

これは、実際には一度に1つのアイテムしか1つのptr_vectorに入れるべきではないことを意味します。しかし、ptr_vectorにアイテムを持ち、ptr_vectorをインベントリオブジェクト(別のptr_vector)が所有するというあなたの考えはうまくいくはずです。私はそれをしたことはありませんが、それはうまくいくはずです。

1つのオブジェクトを削除するには、container_idとitem_idを使用して検索し、項目レベルptr_vectorから削除します。コンテナを削除するには、それを単に在庫から削除します。その時点でそれが含んでいるものはすべて破棄されます。

削除しないで削除する場合は、auto_typeを使用して安全に削除してください。 auto_typeから解放することができますし、オブジェクトへの生ポインタを使用したい場合はどうぞご利用ください。

関連する問題