【问题标题】:How do I use a C++ unique_ptr in a vector?如何在向量中使用 C++ unique_ptr?
【发布时间】:2022-01-24 04:36:56
【问题描述】:

TLDR:我认为我错误地使用了 unique_ptr,但我不知道该怎么做。

我正在尝试编写一个包含在实体组件系统中的简单物理引擎。物理世界本质上是受物理影响的所有对象的主要管理器类,它应该包含世界中实体的所有物理属性(理想情况下存储在 std::vector 中)。在每个更新循环中,引擎解决约束后,它会遍历存储在物理世界中的物理对象向量,并应用力、加速度、冲量等。 还有一个 SceneManager 存储更通用的实体(例如,用于渲染等)和一个 SceneEntity 存储特定于行为的组件。

我选择使用 vector 进行存储,因为每个实体(物理或场景)应该只有一个实例 - 最终用户可以处理原始指针并将其传递给函数等,但实体的生命周期它们由 SceneManager 和 PhysicsWorld 处理。

大体结构如下:

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&lt;unique_ptr&gt;
  • 无法复制唯一指针,这是最可能的原因。
  • 这段代码无法编译

标签: c++ vector components entity unique-ptr


【解决方案1】:

问题是我没有为 PhysicsWorld 定义移动构造函数和移动赋值运算符,所以它使用了默认的,而这反过来又调用了存储在向量中的 PhysicsEntity 的(已删除)复制构造函数。我定义这些之后编译的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多