我想弄清楚如何在我的程序中管理items
。我希望有一个统一的inventory
系统,知道每个item
的位置。然后拥有container
个实际拥有库存items
的对象,并通过container
id找到所有内容。
我的想法是将items
保留在containers
内boost::ptr_vetors
内,然后在inventory
内的哈希表中保留一个指针(可能是同一个)对象,现在根据inventory
改变事物是很容易的,只需更改单个值,将事物从container
X移动到container
Y只需从一个指针移除向量,并将其传递给另一个容器,或在一个container
或其他容器中完成所有工作。
我在考虑问题时遇到的问题是什么时候把所有东西拿出去了。我真的只处理过一次将指针/对象放在一个地方而不是多个,我知道如果我尝试删除已被删除的东西,它将至少导致崩溃。首先想到的是删除containers
中的所有引用,并将其保留在inventory
中,然后逐步执行,并删除inventory
。这是可行的,还是我没有考虑到这一点,需要重新考虑这一点?如果我只需要移除一件东西(保留其余部分)怎么办?
我担心在任何一种情况下都会对指针进行去验证。
答案 0 :(得分:0)
有几种方法可以做到这一点。
boost::shared_ptr
或std::shared_ptr
与标准向量一起使用。那样你就没有
不得不担心删除和内存被逐步释放
只要没有指针引用该对象。如果您需要经常销毁特定对象并且需要的代码量最少,这将非常有用。缺点是存储
如果大多数对象永远不会从其他对象中被破坏并且你有很多对象,那么开销很大。而且,根据您删除对象的位置,它仍然可以在没有容器的情况下驻留在库存中,反之亦然。boost::ptr_vector
,而其他容器是标准向量。这对于频繁添加和查询系统中的对象非常有效。缺点是内存池必须比容器和库存更长。否则,如果个别物品需要与其他物品分开销毁,则必须像(2)中那样进行簿记。答案 1 :(得分:0)
Boost::ptr_vector
会假定对象的所有权。当您从该向量中删除对象时,它将被自动删除。您可以删除项目而不删除它们,但使用内置的auto_type
(请参阅农场示例中的使用情况)。
这意味着您一次只能在一个ptr_vector
中拥有一个项目。但是,您想要在ptr_vector
中拥有项目,然后让ptr_vector
拥有您的广告资源对象(这是另一个ptr_vector)应该有效。我从来没有这样做,但应该没问题。
要删除单个对象,只需使用container_id和item_id进行查找,然后将其从项级ptr_vector
中删除。要删除容器,只需将其从清单中删除即可。它将破坏它在那时包含的任何东西。
如果要删除它们而不删除,请使用auto_type
安全删除它们。您可以从auto_type
释放它们,如果您想使用原始指针指向对象,请随意执行。