主要问题:
如何创建指向可以存储的变量的指针,然后在以后用于访问此变量没有创建副本
以下只是为了回答人们可能为什么要这样做的任何问题
序言
我正在与DirectX进行游戏,我想在另一个类中创建一个实体(一个特殊类)的“列表”。我想这样做,所以我可以跟踪游戏中通过特定方法呈现的所有对象(一个列表用于三角形,另一个用于行,等等)。为了做到这一点,我最初只有一个类,它有一个std::vector<Entity>
,然后该类有一个add(Entity entity)
函数,它将指定的实体添加到向量中。在我开始尝试对向量中的这些实体进行更改之前,这非常顺利。
问题:
首先,我将在主世界循环Entity testEntity = Entity(position);
中创建一个实体,然后将其添加到实体列表entityList.add(testEntity);
。当调用此命令时,它实际上只是在调用add命令时制作实体的副本。这意味着突然有2个实体代表1,主要世界中的实体受到所有游戏逻辑的影响,而实体列表中的实体未更新,但呈现。这两个不同步。
期望的效果:
entityList的std::vector
实际上只是填充了某种指向world循环中实体的指针。然后,当在world循环中更新实体时,entityList具有该实体的相同数据。
答案 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”以获取更多信息。
我希望这会有所帮助。