我正在用C ++编写游戏和附带的引擎。该引擎在很大程度上依赖于使用简单嵌入式脚本语言的自动化。脚本可以创建对象类,在它们上定义事件侦听器,并从中生成实例。目前,必须将实例绑定到脚本全局标识符以保持其存在。显而易见的结果是,不存在匿名对象,这是迄今为止最常见的对象。
目前,使用std::set<Instance*, spatial_sort>
管理实例,其中spatial_sort
是按位置对实例进行排序的仿函数,用于渲染和碰撞检测。在假设它们不可能在五十分之一秒内移动很多的情况下,实例被移除并使用它们当前位置作为提示重新插入每一帧。如果在实例中设置了dead
标志,则将其从集合中删除。 Instance
构造函数和析构函数分别调用insert(this)
和erase(this)
。
为了允许匿名实例,我想将设置更改为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
会将Reference
返回给新的Instance
。 Instance
对象本身永远不会使用shared_ptr
进行管理,因此他们有责任响应合适的事件而自杀,例如动画结束,等级结束等。
感谢您的帮助!重构是一个很好的解决方案,如果它只是工作。
答案 0 :(得分:2)
您可以向Instance
添加静态方法,然后使用该方法创建新对象,并执行管理操作,例如将其添加到集合中:
static Instance* create(int something) {
boost::shared_ptr<Instance> sptr(new Instance(something));
instanceset.insert(sptr);
return sptr.get();
}
如果你想使这成为构造这个类的对象的唯一方法,你也可以使普通的构造函数成为私有或受保护的。
有关这方面的更多信息,请参阅关于"Dynamic binding during initialization"的C ++ FAQ Lite条目,该条目不直接相关,但使用相同的技术来解决构造函数中虚拟函数使用的限制。