2

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

谁能推荐一个合适的解决方法?

编辑:

我做了我一开始应该做的事情,并将Instance类的行为分为两个类:InstanceReference. new SomeClass然后,脚本中的表达式将 a 返回Reference到 new InstanceInstance对象本身从不使用 a 进行管理,shared_ptr因此它们负责自杀以响应合适的事件,例如动画结束、关卡结束等。

谢谢您的帮助!重构是一个很好的解决方案,只要它有效。

4

1 回答 1

2

您可以向其中添加一个静态方法Instance,然后用于创建新对象,并且还可以执行管理工作,例如将其添加到集合中:

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

如果您想让它成为构造此类对象的唯一方法,您还可以将普通构造函数设为私有或受保护。

有关这方面的更多信息,另请参阅有关“初始化期间的动态绑定”的 C++ FAQ Lite 条目,该条目不直接相关,但使用相同的技术来解决对构造函数中使用虚函数的限制。

于 2010-01-19T06:33:46.840 回答