2012-05-03 25 views
0

我想弄清楚如何在我的程序中管理items。我想有一個統一的inventory系統,知道每個item在哪裏。然後有container對象,它們實際上保存了清單items,並且所有內容都可以通過container id找到。在多個位置引用的對象

我的想法是有舉行內部boost::ptr_vetorscontainersitems,然後按住哈希表內的指針(可能是同一個)inventory對象的內部,現在各地轉移東西,在inventory而言是很容易,只是更改單個值,並將事件從container X移動到container Y只是從一個指針向量中移除,並將其傳遞到另一個容器,或在一個container或其他中執行所有工作。

我遇到麻煩的問題是什麼時候把所有東西都拿出來。我真的只處理過一次在一個地方持有一個指針/對象而不是多個,而且我知道如果我嘗試刪除已經被刪除的東西,它至少會導致崩潰。首先想到的是從containers中刪除所有的引用,並仍然保留在inventory中,然後逐步完成並刪除inventory。這是可行的,還是我沒有考慮這個權利,需要重新考慮這一點?那麼如果我只需要刪除一件東西(保持其餘)呢?

我擔心在這兩種情況下取​​消驗證指針。

+0

爲什麼不使用智能指針向量(在C++ 11或Boost中)?你不必關心你是否必須刪除你的指針了。但我不確定是否瞭解您的問題... – Uflex

回答

0

有幾種方法可以做到這一點。

  1. 使用boost::shared_ptrstd::shared_ptr與標準載體。這樣,你不需要擔心刪除和增量釋放內存 每當沒有指針引用對象。如果您需要頻繁銷燬特定對象並需要最少量的代碼,這可能很有用。不利的一面是如果大多數物體除了剩下的物體都不會被破壞,並且物體很多,那麼存儲空間將會是 。並且,取決於您移除對象的位置,它仍可以在沒有容器的情況下駐留在庫存中,反之亦然。
  2. 通過派生或包裝他們到另一個班級,爲容器提供銷燬和去銷售責任。由於每個對象的指針只出現在您所描述的一個容器中,因此只有庫存可能包含額外的指針。因此,無論何時要移除對象,容器都必須查找庫存以移除指向要銷燬的對象的指針。間接費用是存貨的簿記。
  3. 使用一個內存池,該內存池是存儲指向所有對象的指針的容器,並在其本身被銷燬時負責其銷燬。內存池可以是boost::ptr_vector,而其他容器是標準向量。這對頻繁添加和查詢系統中的對象非常有效。缺點是內存池必須比你的容器和庫存活得多。否則,如果單個物體需要與其他物體分開銷燬,則必須像(2)中那樣進行簿記。
0

Boost::ptr_vector當您傳入對象時會承擔對象的所有權。當您從該向量中移除對象時,它將被自動刪除。您可以使用內置的auto_type刪除項目而不刪除它們(請參閱農場示例中的使用情況)。

這意味着您一次只能有一個ptr_vector中的項目。不過,您的清單對象(這是另一個ptr_vector)擁有ptr_vector中的項目,然後讓ptr_vector擁有該項目的想法應該有效。我從來沒有這樣做,但它應該沒問題。

爲了刪除單個對象,只需使用container_id和item_id查找它,然後將其從項目級別ptr_vector中刪除。爲了刪除容器,只需從庫存中刪除它。它會破壞當前包含的任何內容。

如果你想刪除它們而不刪除使用auto_type安全地刪除它們。你可以從auto_type中釋放它們,並且如果你想使用原始指針指向對象,可以隨心所欲。

相關問題