C ++ - Vector中的对象无法修改

时间:2017-02-15 03:39:58

标签: c++ arrays vector

我正在尝试创建一个存储Chest s向量的类,其中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的成员变量。

2 个答案:

答案 0 :(得分:2)

你的循环:

With Worksheets("Sheet1").Range("F2")
    .NumberFormat = "mm/dd/yy;@"
End With

将生成for (Chest chest : chests) { ... } 个对象的临时副本,因此将在该临时对象上调用Chest方法。你想要的是对象的引用,如下所示:

OnInteract()

以便更改(for (Chest &chest : chests) { ... } 方法中可能发生的变化)应用于OnInteract()容器内的对象,而不是它们的临时副本。

答案 1 :(得分:0)

在致电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限定符。这是在基于循环的范围内创建变量的首选方法。