gpt4 book ai didi

c++ - 维护一个 std::set

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:05 25 4
gpt4 key购买 nike

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

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

为了允许匿名实例,我想将集合更改为 std::set<boost::shared_ptr<Instance>, spatial_sort> , 这将允许 Instance共享实例的所有权并保持它们的存在,直到它们 self 毁灭。不幸的是,因为调用 insert()需要放在构造函数中,shared_from_this()无法获得 shared_ptrInstance . 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();
}

如果你想让它成为构造此类对象的唯一方法,你还可以将普通构造函数设为私有(private)或 protected 。

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

关于c++ - 维护一个 std::set<boost::shared_ptr>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2091500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com