我正在尝试创建一个存储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));
}
其中open
和chest
是Chest
的成员变量。
答案 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限定符。这是在基于循环的范围内创建变量的首选方法。