2010-01-19 59 views
2

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

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

编辑:

我做了我应该已经摆在首位做的,分裂Instance类的行为分为两类:InstanceReference。在脚本中的表达式new SomeClass然后将Reference返回到新的Instance。该Instance对象本身使用的是shared_ptr从来没有成功,所以他们有责任响应自杀到合适的事件,例如,动画的结束,水平的结束,等

感谢您的帮助!重构与任何Just Works一样是一个很好的解决方案。

回答

2

你可以一个静态方法添加到Instance,你再使用它来创建新的对象,并且也做行政的东西一样将其添加到组:

static Instance* create(int something) { 
    boost::shared_ptr<Instance> sptr(new Instance(something)); 
    instanceset.insert(sptr); 
    return sptr.get(); 
} 

如果你想使这个唯一的出路为了构造这个类的一个对象,你也可以使普通的构造函数为private或protected。

关于这方面的更多信息,请参阅关于"Dynamic binding during initialization"的C++ FAQ Lite条目,这些条目不直接相关,但使用相同的技术来解决构造函数中虚拟函数使用的限制。

+3

更好的是,返回shared_ptr而不是原始的。 – rlbond 2010-01-19 06:42:46

+0

我现在正在搞这个解决方案;基本上create()只会被调用来创建匿名实例,并使用“匿名”标志集来初始化实例。如果未设置此标志,那么默认情况下,实例默认使用空删除器执行shared_ptr的insert()。目前我正在尝试追踪由于更改而导致的神秘的bad_weak_ptr异常。 – 2010-01-19 07:26:04

+0

*“如果未设置此标志,那么实例默认执行一个shared_ptr的insert()给自己”*我不确定你到底在做什么,但听起来它会再次运行在施工过程中不能调用shared_from_this()。还要注意''shared_from_this()'只适用于实际存储在某个shared_ptr中的对象。例如,静态分配的实例上的'shared_from_this()'不起作用。 – sth 2010-01-19 07:54:58

相关问题