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