4

我有一个游戏服务器。它创建多个实例Game并将它们(或指向它们的指针?什么更好?它有 10 个ints和 5 个其他指针,10 个成员函数)添加到向量中。之后一些事件发生在游戏内部,例如game_ends。此时应该从向量中删除游戏......实现它的最佳方法是什么?

我们找到的两种方法是:

  1. 创建观察者模式。服务器将是一个观察者,游戏将发送一个事件来删除它。

  2. 将游戏设置为ended状态,同时服务器不断扫描向量并删除处于ended状态的游戏。

4

4 回答 4

2

指针或实例

如果您使用创建指针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))

于 2012-08-23T22:48:04.733 回答
2

撇开应用程序的性质不谈,如果您通过值而不是指针将对象添加到向量中,一旦将它们从向量中删除,您就不必担心自己删除它们。如果您必须动态创建对象并将它们作为指针添加到向量中,您将负责删除它们。

于 2012-08-23T22:25:57.613 回答
2

一个对象不应该真正决定它自己的生命周期。您可能应该拥有某种管理上下文,它拥有容器并且可以决定对象何时需要离开。实际Game元素可能会以某种方式通知管理器它们已完成,但它们不应该删除自己,或从集合中删除自己。

于 2012-08-23T22:30:00.943 回答
1

创建一个对象或指向对象的指针游戏?

游戏对象大吗?它是否包含其他指针或指向文件、套接字或其他此类事物的指针?

如果其中任何一个的答案是肯定的,那么你应该新建游戏对象,并存储一个指向它的指针。

你应该使用观察者还是经常扫描?

为了更好地回答这个问题,我需要更多地了解您的程序。目前,这似乎是一个您更适合做出的设计决定。如果您不断扫描,您将需要旋转一个线程。这可能不是你想要的。

我个人会使用观察者模式。

于 2012-08-23T22:25:17.020 回答