C++ - 无法修改矢量中的对象

C++ - Objects in Vector Unable to be Modified

本文关键字:对象 修改 C++      更新时间:2023-10-16

我正在尝试创建一个存储Chests 向量的类,其中Chest是我创建的自定义类。以下是ItemManager.h的相关部分:

class ItemManager
{
public:
...
void GenerateItems(sf::Vector2u currentPos);
void CheckCollisions(Collider& collider);
...
private:
std::vector<Chest> chests;
};

然后这里是(相关部分)ItemManager.cpp

void ItemManager::GenerateItems(sf::Vector2u currentPos)
{
if (rand() % 50 == 0)
chests.push_back(Chest(sf::Vector2f(16 * currentPos.x + 1, 16 * currentPos.y - 4 - 2)));
}
void ItemManager::CheckCollisions(Collider & collider)
{
for (Chest chest : chests)
if (collider.CheckCollision(chest.getCollider(), 1.0f))
chest.OnInteract();
}

我现在遇到的问题是,即使chest.OnInteract()被召唤CheckCollisions(),胸部也没有发生任何事情。但是,这不是该方法的问题,因为当我在方法GenerateItems()中调用chest.OnInteract()时,它会将预期的内容应用于胸部。我的信念是,因为我正在另一种方法中创建一个局部变量来添加vector,所以添加的对象超出了范围,我无法再引用它。但是,我相信添加到vector会创建一个副本,因此这应该不是问题。任何帮助,不胜感激。

编辑
这是我OnInteract()方法:

void Chest::OnInteract()
{
open = true;
chest.setSize(sf::Vector2f(14, 16));
chest.move(sf::Vector2f(0, -2));
chest.setTextureRect(sf::IntRect(14, 0, 14, 16));
}

其中openchestChest的成员变量。

你的循环:

for (Chest chest : chests) { ... }

将创建Chest对象的临时副本,因此将在该临时对象上调用OnInteract()方法。相反,你想要的是对对象的引用,如下所示:

for (Chest &chest : chests) { ... }

以便将更改(大概发生在OnInteract()方法中)应用于chests容器中的对象,而不是它们的临时副本。

在调用chest.OnInteract()之前,您实际上复制了Chest对象:

//       ,--- Chest is a local variable, not a reference.
//       v    It is constructing with the value of each chest in chests.
for (Chest chest : chests)
if (collider.CheckCollision(chest.getCollider(), 1.0f))
chest.OnInteract();

只需创建引用而不是对象即可解决问题:

for (auto&& chest : chests)
if (collider.CheckCollision(chest.getCollider(), 1.0f))
chest.OnInteract();

auto&&只是意味着无论类型、值类别或 cv 限定符如何,您都需要一个参考。这是在基于 for 循环的范围中创建变量的首选方法。