C ++管理对象

时间:2012-08-23 22:21:40

标签: c++ class object delete-operator

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

我们采取的两种方式是:

  1. 创建一个观察者模式。服务器将成为观察者,游戏将派遣一个事件将其删除。

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

4 个答案:

答案 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)

  

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

游戏对象大吗?它是否包含其他指针或指向文件,套接字或其他类似的东西?

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

  

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

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

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