制作变量列表而不复制它们

时间:2014-01-28 01:48:10

标签: c++ pointers reference

主要问题:
如何创建指向可以存储的变量的指针,然后在以后用于访问此变量没有创建副本


以下只是为了回答人们可能为什么要这样做的任何问题

序言
我正在与DirectX进行游戏,我想在另一个类中创建一个实体(一个特殊类)的“列表”。我想这样做,所以我可以跟踪游戏中通过特定方法呈现的所有对象(一个列表用于三角形,另一个用于行,等等)。为了做到这一点,我最初只有一个类,它有一个std::vector<Entity>,然后该类有一个add(Entity entity)函数,它将指定的实体添加到向量中。在我开始尝试对向量中的这些实体进行更改之前,这非常顺利。

问题:
首先,我将在主世界循环Entity testEntity = Entity(position);中创建一个实体,然后将其添加到实体列表entityList.add(testEntity);。当调用此命令时,它实际上只是在调用add命令时制作实体的副本。这意味着突然有2个实体代表1,主要世界中的实体受到所有游戏逻辑的影响,而实体列表中的实体未更新,呈现。这两个不同步。

期望的效果:
entityList的std::vector实际上只是填充了某种指向world循环中实体的指针。然后,当在world循环中更新实体时,entityList具有该实体的相同数据。

2 个答案:

答案 0 :(得分:2)

我不清楚你遇到麻烦的地方,所以这可能无法回答这个问题:

似乎您只想存储指向Entity对象的指针向量。即std::vector<Entity*>

如果你知道testEntity将在向量的生命周期范围内,你可以只向它添加一个指向它的向量。即entityList.add(&testEntity)

如果该假设不正确,您可能希望在堆上分配您的Entity对象(例如Entity* testEntityPtr = new Entity(position);。如果您正在使用C ++ 11(或者即使您不是),你可能想在这种情况下使用shared_ptr和make_shared。

答案 1 :(得分:0)

您可以使用c ++ 11 Move Semantics来保存数据。如果Entity具有指向您不想复制的某些已分配数据的指针成员,则可以实现Move语义,该语义本质上将所有权转移到您放置在向量中的副本。 例如:

Entity(Entity&& entity)//move constructor
{
    this->data = std::move(entity.data);
    //and so on.
}

您还需要一个“移动分配操作符”Entity& operator=(Entity&& entity);

您需要查找“Move Semantics”和“rvalue references”以获取更多信息。

我希望这会有所帮助。