C++管理对象

C++ managing objects

本文关键字:对象 管理 C++      更新时间:2023-10-16

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

我们有两种方法:

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

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

指针或实例

如果你使用new创建指针,你必须记住删除它。如果你使用的是一个真实的实例,请确保你定义了一个copy constructor,因为std::vector经常复制你的对象。

您可以使用boost::sharedPointer<Game>。不要将std::auto_ptr<Game>std::vector 一起使用

根据实施选项,我将考虑以下内容:

观察者模式是优雅的,但它会被称为多少次?从矢量中删除将是O(n),因为你必须找到它,然后erase它。

如果你知道你将在一分钟内拥有的最大游戏数,并且适合记忆,那么你只需要有一个线程,它每分钟迭代一次向量,并删除任何ended游戏。

如果内存很关键,则必须使用观察者模式。如果你有很多游戏,并且每个游戏都有一个唯一的标识符,你可以考虑std::map而不是vector,然后使用观察者模式从地图中删除O(log(n))

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

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

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

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

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

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

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

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