维护std :: set <boost :: shared_ptr> </boost :: shared_ptr>

时间:2010-01-19 06:16:00

标签: c++ boost set shared-ptr

我正在用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_ptrInstanceInstance恰好已经通过其基类继承自boost::enable_shared_from_this<>并不重要。

任何人都可以推荐合适的解决方法吗?

修改

我做了我本来应该做的事情,并将Instance类的行为分为两类:InstanceReference。然后,脚本中的表达式new SomeClass会将Reference返回给新的InstanceInstance对象本身永远不会使用shared_ptr进行管理,因此他们有责任响应合适的事件而自杀,例如动画结束,等级结束等。

感谢您的帮助!重构是一个很好的解决方案,如果它只是工作。

1 个答案:

答案 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条目,该条目不直接相关,但使用相同的技术来解决构造函数中虚拟函数使用的限制。