代码之家  ›  专栏  ›  技术社区  ›  Jon Purdy

维护STD::SETPosi::SyrdYPPTR >

  •  2
  • Jon Purdy  · 技术社区  · 15 年前

    我正在用C++编写一个游戏和一个附带的引擎。引擎在很大程度上依赖于使用简单的嵌入式脚本语言的自动化。脚本可以创建对象类,在其上定义事件侦听器,并从中生成实例。目前,一个实例必须绑定到脚本全局标识符才能保持其存在。这样做的明显结果是,不可能有匿名对象,这将是迄今为止最常见的。

    目前,使用 std::set<Instance*, spatial_sort> 在哪里 spatial_sort 是按位置对实例排序的函子,用于渲染和碰撞检测。在假设实例不可能在五十分之一秒内移动整个帧的情况下,将实例移除并使用其当前位置作为提示重新插入每个帧。如果A dead 在实例中设置标志,它将从集合中删除。这个 Instance 构造函数和析构函数调用 insert(this) erase(this) ,分别是。

    为了允许匿名实例,我想将集合更改为 std::set<boost::shared_ptr<Instance>, spatial_sort> ,这将允许 实例 分享实例的所有权并保存它们的存在直到它们毁灭自己。不幸的是,因为 insert() 需要放在构造函数中, shared_from_this() 不适用于获得 shared_ptr 实例 . 这一点都不重要 实例 碰巧已经继承了 boost::enable_shared_from_this<> 通过它的基类。

    有人能推荐一个合适的解决方法吗?

    编辑:

    我做了我本来应该做的事,把 实例 分为两类: 实例 Reference . 表达 new SomeClass 在脚本中,然后返回 参考文献 新的 实例 . 这个 实例 对象本身从不使用 SelddPPTR ,因此他们负责在适当的事件(如动画结束、级别结束等)下自杀。

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

    1 回复  |  直到 15 年前
        1
  •  2
  •   sth    15 年前

    您可以将静态方法添加到 Instance 然后用于创建新对象,还可以执行管理操作,如将其添加到集合:

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

    如果你想让它成为构造这个类的对象的唯一方法,你也可以让普通的构造函数成为私有的或者受保护的。

    有关这方面的更多内容,请参见C++FAQLite条目 "Dynamic binding during initialization" ,它不是直接相关的,但使用相同的技术来解决构造函数中使用虚拟函数的限制。