我有一个游戏服务器。它会创建Game
的实例数并添加它们(或者指向它们的指针?它有更好的内容?它有10个ints
和5个其他指针,10个成员函数)到向量。之后,一些事件发生在游戏内部e。 G。 game_ends。在这个时刻,应该从矢量中删除游戏......实现它的最佳方法是什么?
我们采取的两种方式是:
创建一个观察者模式。服务器将成为观察者,游戏将派遣一个事件将其删除。
将游戏设置为ended
状态,同时服务器不断扫描向量并删除处于ended
状态的游戏。
答案 0 :(得分:2)
除了你的应用程序的性质,如果你通过值而不是指针向向量添加对象,一旦从向量中删除它们,你就不必担心自己删除它们了。如果你必须动态创建对象并将它们作为指针添加到向量中,那么你将负责删除它们。
答案 1 :(得分:2)
对象不应该真正确定自己的生命周期。您应该拥有某种拥有容器的管理上下文,它可以决定对象何时需要运行。实际的Game
元素可能以某种方式通知经理他们已经完成,但他们不应该删除自己,或者从集合中删除自己。
答案 2 :(得分:2)
指针或实例
如果使用new
创建指针,则必须记住删除它。如果您使用的是真实实例,请务必定义copy constructor
,因为std::vector
会经常复制您的对象。
您可以使用boost::sharedPointer<Game>
。不要将std::auto_ptr<Game>
与std::vector
从实施选项中,我会考虑以下内容:
观察者模式优雅,但会被调用多少次?从向量中删除将是O(n),因为您必须找到它,然后erase
它。
如果你知道你将拥有的最大游戏,比如一分钟,并且适合内存,你可以拥有一个每分钟遍历矢量并删除任何ended
游戏的线程。
如果内存很关键,则必须使用观察者模式。如果您有很多游戏以及每个游戏的唯一标识符,则可以考虑std::map
而不是vector
,然后使用观察者模式从地图中删除O(log(n))
答案 3 :(得分:1)
创建一个对象或指向对象游戏的指针?
游戏对象大吗?它是否包含其他指针或指向文件,套接字或其他类似的东西?
如果其中任何一个的答案都是肯定的,那么你应该新建游戏对象,并存储指向它的指针。
你应该使用观察者还是经常扫描?
为了更好地回答这个问题,我需要了解更多有关您的计划的信息。目前,您似乎更适合做出设计决定。如果你不断扫描,你需要旋转一个线程。这可能不是你想要的。
我个人会使用观察者模式。