我正在用 C++ 编写游戏和随附的引擎。该引擎严重依赖于使用简单的嵌入式脚本语言的自动化。脚本可以创建对象类,在它们上定义事件监听器,并从中产生实例。目前,实例必须绑定到脚本全局标识符才能保持其存在。这样做的明显结果是不能有匿名对象,这将是迄今为止最常见的。
目前,实例是使用 来管理的std::set<Instance*, spatial_sort>
,其中spatial_sort
是一个按位置对实例进行排序的仿函数,用于渲染和碰撞检测。在假设它们不太可能在五十分之一秒内移动很多的情况下,使用它们的当前位置作为提示,实例被删除并重新插入每一帧。如果dead
在实例中设置了标志,则会从集合中删除它。构造Instance
函数和析构函数分别调用insert(this)
和erase(this)
。
为了允许匿名实例,我想将集合更改为 a std::set<boost::shared_ptr<Instance>, spatial_sort>
,这将允许Instance
共享实例的所有权并保持它们的存在,直到它们自我毁灭。不幸的是,由于insert()
需要将调用放在构造函数中,shared_from_this()
因此无法获得shared_ptr
对Instance
. Instance
碰巧已经boost::enable_shared_from_this<>
通过其基类继承并不重要。
谁能推荐一个合适的解决方法?
编辑:
我做了我一开始应该做的事情,并将Instance
类的行为分为两个类:Instance
和Reference
. new SomeClass
然后,脚本中的表达式将 a 返回Reference
到 new Instance
。Instance
对象本身从不使用 a 进行管理,shared_ptr
因此它们负责自杀以响应合适的事件,例如动画结束、关卡结束等。
谢谢您的帮助!重构是一个很好的解决方案,只要它有效。