C++ - 无法修改矢量中的对象
C++ - Objects in Vector Unable to be Modified
我正在尝试创建一个存储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()
,胸部也没有发生任何事情。但是,这不是该方法的问题,因为当我在方法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));
}
其中open
和chest
是Chest
的成员变量。
你的循环:
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 循环的范围中创建变量的首选方法。
相关文章:
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 使用可变允许修改unordered_set中的对象
- 未定义的对象(〔basic.life〕/8):为什么允许引用重新绑定(和常量修改)
- 如何修改函数中的对象?
- 结构对象的指针成员在传递给函数时被修改
- 修改多线程应用程序中的对象
- 通过引用在矢量中放置和修改对象
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 如何修复对象在释放后可能修改的malloc错误
- const 方法使用引用修改对象
- C++ API:修改内部对象
- C++ 在其自己的类中创建对象的修改副本
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 在C 向量中修改对象值的麻烦
- 使用基对象修改/访问派生类的信息的有问题的设计
- 对象修改通知
- 从c++中GUI中创建的对象修改GUI
- 将等待多个对象修改*多个*对象的状态