【发布时间】:2022-01-24 04:36:56
【问题描述】:
TLDR:我认为我错误地使用了 unique_ptr,但我不知道该怎么做。
我正在尝试编写一个包含在实体组件系统中的简单物理引擎。物理世界本质上是受物理影响的所有对象的主要管理器类,它应该包含世界中实体的所有物理属性(理想情况下存储在 std::vector 中)。在每个更新循环中,引擎解决约束后,它会遍历存储在物理世界中的物理对象向量,并应用力、加速度、冲量等。 还有一个 SceneManager 存储更通用的实体(例如,用于渲染等)和一个 SceneEntity 存储特定于行为的组件。
我选择使用 vector
大体结构如下:
class PhysicsWorld
{
private:
unique_ptr<PhysicsEntity> entities;
public:
void addEntity(PhysicsEntity * entity)
{
unique_ptr<PhysicsEntity> entity_ptr(entity);
entities.push_back(std::move(entity_ptr));
}
}
class PhysicsEntity
{
private:
unsigned int id;
float gravity;
public:
Entity();
~Entity();
void setGravity(float val);
}
PhysicsWorld world{};
PhysicsEntity * physent = new PhysicsEntity{};
physent->setGravity(3.0f);
world.addEntity(physent)
SceneManager scene{};
RigidbodyComponent * rbcomp = new Rigidbody{ent};
SceneEntity * sceneEnt = new SceneEntity{};
sceneEnt->addComponent(rbcomp);
scene->addEntity(sceneEnt);
我的问题是,当我运行此代码时,我从 xutility 收到一个错误,提示“尝试引用已删除的函数” - 我相信它发生在 world.addEntity() 周围的某个地方。经过大量搜索,我得出结论,这是由于我使用了 unique_ptr。发生此错误是因为 unique_ptr 不是该工作的正确工具,还是我遗漏了什么 - 或者是其他地方的错误?
【问题讨论】:
-
它告诉你你试图引用的具体删除函数是什么?实际上,更重要的是:在这段代码中,哪里有
vector呢?entities是单个unique_ptr,而不是vector<unique_ptr>。 -
无法复制唯一指针,这是最可能的原因。
-
这段代码无法编译
标签: c++ vector components entity unique-ptr