我正在尝试创建一个存储 Chest vector 的类,其中 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() ,胸部也没有发生任何事情。但是,这不是该方法的问题,因为当我在 chest.OnInteract() 方法中调用 GenerateItems() 时,它​​会将预期应用到胸部。我的信念是,因为我在另一种方法中创建了一个局部变量来添加 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 容器内的对象,而不是它们的临时拷贝。

关于C++ - Vector 中的对象无法修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42240288/

10-10 10:32