C++ 管理对象
Posted
技术标签:
【中文标题】C++ 管理对象【英文标题】:C++ managing objects 【发布时间】:2012-08-23 22:21:39 【问题描述】:我有一个游戏服务器。它创建Game
的多个实例并将它们添加到向量中(或者指向它们的指针?什么更好?它有10 个ints
和5 个其他指针,10 个成员函数)。之后,一些事件发生在游戏内 e。 G。游戏结束。此时游戏应该从向量中删除...实现它的最佳方法是什么?
我们得出的两种方法是:
创建观察者模式。服务器将是一个观察者,游戏将发送一个事件来删除它。
将游戏设置为ended
状态,同时服务器不断扫描向量并删除处于ended
状态的游戏。
【问题讨论】:
【参考方案1】:指针或实例
如果你使用new
创建一个指针,你必须记得删除它。如果您使用的是真实实例,请确保您定义了 copy constructor
,因为 std::vector
经常复制您的对象。
您可以使用boost::sharedPointer<Game>
。不要将std::auto_ptr<Game>
与std::vector
一起使用
从实施选项我会考虑以下几点:
观察者模式很优雅,但它会被调用多少次?从向量中删除将是 O(n),因为你必须找到它然后 erase
它。
如果您知道您将拥有的最大游戏数,比如一分钟,并且适合内存,那么您可以只使用一个线程每分钟迭代一次向量并删除任何ended
游戏。
如果内存很重要,则必须使用观察者模式。如果你有很多游戏,并且每个游戏都有唯一标识符,你可以考虑std::map
而不是vector
,然后使用观察者模式从地图中删除O(log(n))
【讨论】:
【参考方案2】:抛开应用程序的性质不谈,如果您通过值而不是指针将对象添加到向量中,一旦将它们从向量中删除,您就不必担心自己删除它们。如果您必须动态创建对象并将它们作为指针添加到向量中,您将负责删除它们。
【讨论】:
除非它是智能指针的向量。这将是明智的。 是的,我相信 boost 也有一个向量类型,它接受指针并在它们被擦除时自动释放内存——我在输入时寻找指向它的链接【参考方案3】:一个对象不应该真正决定它自己的生命周期。您可能应该拥有某种管理上下文,它拥有 container 并且可以决定对象何时需要离开。实际的 Game
元素可能会以某种方式通知管理器它们已完成,但它们不应删除自己,或将自己从集合中删除。
【讨论】:
我不同意对象管理自己的生命周期。对于某些任务(异步调度、生成另一个程序),对象在完成后自行销毁是完全可以接受的。【参考方案4】:创建一个对象或指向对象的指针游戏?
游戏对象大吗?它是否包含其他指针或指向文件、套接字或其他类似东西的指针?
如果其中任何一个的答案是肯定的,那么您应该新建游戏对象,并存储一个指向它的指针。
你应该使用观察者还是持续扫描?
为了更好地回答这个问题,我需要更多地了解您的计划。目前,这似乎是一个您更适合做出的设计决定。如果您不断扫描,您将需要旋转一个线程。这可能不是你想要的。
我个人会使用观察者模式。
【讨论】:
它有 10 个整数和 5 个其他指针,10 个成员函数并存储 2 个套接字描述符 @Kolyunya 如果您的对象拥有套接字,那么我认为您不能安全地将其复制到矢量旁边的另一个对象中。新建它并存储一个指针。请参阅有关复制套接字的信息:***.com/questions/5425666/… 但是套接字文件描述符只是一个整数。比如5
或10
。问题是什么,如果我将此整数存储到实例中并将实例推送到向量中?它只是一个整数。
@Kolyunya:如果对象拥有套接字描述符,它会在销毁时关闭它,因此,如果您制作副本,您将尝试关闭两次相同的套接字。
不,不,不...套接字由其他类管理...game
存储套接字描述符仅用于向它们发送数据以上是关于C++ 管理对象的主要内容,如果未能解决你的问题,请参考以下文章
C++笔记--面向对象(OOP)编程基础(new/delete类的静态成员c++编译器对象管理模型分析)(3-2)