我正在用C++编写游戏和附带的引擎。该引擎在很大程度上依赖于使用简单嵌入式脚本语言的自动化。脚本可以创建对象类,在其上定义事件侦听器,并从中生成实例。目前,必须将实例绑定到脚本全局标识符以保持其存在。这样做的显而易见的结果是,不存在匿名对象,这将是最常见的。维护std :: set <boost :: shared_ptr>
目前,实例使用std::set<Instance*, spatial_sort>
进行管理,其中spatial_sort
是一种按位置对实例进行排序的函子,用于渲染和碰撞检测。假设他们不可能在五十分之一秒内移动很多东西,那么实例将被删除并使用其当前位置作为提示重新插入每一帧。如果在实例中设置了dead
标志,则将从该集合中删除该标志。构造函数和析构函数分别调用insert(this)
和erase(this)
。
为了允许匿名实例,我想将该设置更改为std::set<boost::shared_ptr<Instance>, spatial_sort>
,这将允许Instance
共享实例的所有权并保留它们的存在,直到它们自行销毁。不幸的是,因为insert()
的调用需要放在构造函数中,所以shared_from_this()
将不能用于获得的shared_ptr
。 Instance
碰巧已经通过其基类继承自boost::enable_shared_from_this<>
并不重要。
任何人都可以推荐一个合适的解决方法吗?
编辑:
我做了我应该已经摆在首位做的,分裂Instance
类的行为分为两类:Instance
和Reference
。在脚本中的表达式new SomeClass
然后将Reference
返回到新的Instance
。该Instance
对象本身使用的是shared_ptr
从来没有成功,所以他们有责任响应自杀到合适的事件,例如,动画的结束,水平的结束,等
感谢您的帮助!重构与任何Just Works一样是一个很好的解决方案。
更好的是,返回shared_ptr而不是原始的。 – rlbond 2010-01-19 06:42:46
我现在正在搞这个解决方案;基本上create()只会被调用来创建匿名实例,并使用“匿名”标志集来初始化实例。如果未设置此标志,那么默认情况下,实例默认使用空删除器执行shared_ptr的insert()。目前我正在尝试追踪由于更改而导致的神秘的bad_weak_ptr异常。 – 2010-01-19 07:26:04
*“如果未设置此标志,那么实例默认执行一个shared_ptr的insert()给自己”*我不确定你到底在做什么,但听起来它会再次运行在施工过程中不能调用shared_from_this()。还要注意''shared_from_this()'只适用于实际存储在某个shared_ptr中的对象。例如,静态分配的实例上的'shared_from_this()'不起作用。 – sth 2010-01-19 07:54:58