0

我试图弄清楚如何items在我的程序中进行管理。我想要一个统一的inventory系统,知道每个人在哪里item。然后拥有container实际保存库存的对象items,并通过containerid 定位所有内容。

我的想法是itemscontainersinside中保存,然后在对象boost::ptr_vetors内部的哈希表中保存一个指针(可能是同一个) ,现在根据X 到Y 只是从一个指针向量中删除,并将其传递给另一个容器,或者在一个或另一个中完成所有工作。inventoryinventorycontainercontainercontainer

我很难考虑的问题是什么时候把所有的东西都拿出来。我只真正处理过一次将指针/对象保存在一个地方而不是多个地方,而且我知道如果我尝试删除已经被删除的东西,它至少会导致崩溃。首先想到的是从 中删除所有引用containers,并且仍然保留在 中inventory,然后单步执行并删除inventory. 这是可行的,还是我没有考虑这个权利,需要重新考虑?那么如果我只需要删除一个东西(保留其余部分)怎么办?

我担心在任何一种情况下都会取消对指针的验证。

4

2 回答 2

0

有几种方法可以做到这一点。

  1. 使用boost::shared_ptrstd::shared_ptr与标准向量。这样,您就不必担心删除,并且只要没有指针引用该对象,就会逐渐释放内存。如果您需要经常销毁特定对象并且需要最少的代码,这将很有用。不利的一面是存储开销,如果大多数对象除了其余对象之外永远不会被销毁并且您有很多对象。而且,根据您移除对象的位置,它仍然可以在没有容器的情况下驻留在库存中,反之亦然。
  2. 通过派生它们或将它们包装在另一个类中,赋予容器销毁和从库存中取消索引的责任。由于每个对象的指针仅出现在您所描述的一个容器中,因此只有库存可能包含额外的指针。因此,无论何时要删除一个对象,容器都必须查找清单以删除指向它即将销毁的对象的指针。间接费用是存货的簿记。
  3. 使用内存池,它是一个容器,存储指向所有对象的指针,并在自身被销毁时负责它们的销毁。内存池可以是boost::ptr_vector其他容器,而其他容器是标准向量。这对于在系统中频繁添加和查询对象是有效的。缺点是内存池必须比您的容器和库存更长。否则,如果需要将单个对象与其他对象分开销毁,则必须像(2)中那样进行簿记。
于 2012-05-03T08:42:29.583 回答
0

Boost::ptr_vector当您传入该对象时,它会假定该对象的所有权。当您从该向量中删除一个对象时,它将被自动删除。您可以通过使用内置删除项目而不删除它们auto_type(请参阅农场庭院示例以了解用法)。

这意味着您实际上应该一次只拥有一个项目ptr_vector。但是,您将物品放在 a 中ptr_vector然后ptr_vector由您的库存对象(这是另一个 ptr_vector)拥有的想法应该可行。我从来没有这样做过,但应该没问题。

为了删除单个对象,您只需使用 container_id 和 item_id 查找它,然后将其从 item-level 中删除ptr_vector。要删除容器,只需将其从库存中移除即可。它会破坏它在那个时候包含的任何东西。

如果您想在不删除的情况下删除它们,请使用auto_type安全删除它们。auto_type如果您想使用指向对象的原始指针,您可以从 中释放它们并随心所欲。

于 2012-05-03T08:43:22.413 回答