我在写游戏和一所附的发动机在C++。引擎严重依赖自动化,使用一个简单的嵌入式脚本语言。脚本可以创建对象类,确定事件的听众对他们的,并产生实例。目前,一个实例必须限于一个剧本-全局标识符,以便维护其存在。明显的结果是,有没有可匿名对象,这将是迄今最常见的。

目前,实例是管理使用 std::set<Instance*, spatial_sort>, ,哪里 spatial_sort 是一个函数,各种实例的位置时,渲染和碰撞的检测。实例被删除,并重新插入每一个框架使用他们目前的位置作为一个暗示,在假定他们不可能移动一个整体很多在第五十一第二。如果一个 dead 标志的设的实例,它被删除,从定。的 Instance 构造和destructor调用 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 类为两类: InstanceReference.表达 new SomeClass 在一个剧本,然后返回一个 Reference 一个新的 Instance.的 Instance 的对象本身从来没有管理的使用 shared_ptr, 所以他们负责自杀响应适当活动,例如结束的动画结尾的水平,等等。

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

有帮助吗?

解决方案

你可以添加一个静态的方法 Instance 那你然后用来建立新的对象,也不管理这样的东西添加到集:

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

如果你想使这个唯一的方式建造此类的对象也可以使正常的构造私人或保护。

欲了解更多有关这一点还可参看C++常见问题的精简条约 "动态地结合在初始化过程中", 没有直接相关,但采用相同的技术工作周围限制使用虚拟职能的构造.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top