2017-02-15 7 views
3

Я пытаюсь создать класс, в котором хранится вектор Chest, где Chest - это собственный класс, который я создал. Вот соответствующая часть ItemManager.h:C++ - Объекты в векторе не могут быть изменены

А то здесь (соответствующие части) 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.

ответ

2

Ваш цикл:

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

сделает временную копию Chest объектов, поэтому метод OnInteract() будет вызываться на этом временный объект. То, что вы хотите вместо того, чтобы это ссылка на объект, например, так:

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

так, что изменения (presumibly происходит в методе OnInteract()) применяются к объектам внутри chests контейнера, а не временная копия них.

+0

Хорошо, я подумал, что это будет что-то в этом роде. Тем не менее, я просто попробовал то, что вы сказали, и это, похоже, не имеет никакого значения: нужно ли мне также редактировать, как я обращаюсь к сундуку внутри цикла? –

+0

Нет, все в порядке. Как выглядит ваш метод 'OnInteract()'? – simpel01

+0

Кроме того, вы уверены, что условие оператора 'if' когда-либо будет возвращено' true'? Возможно, ваша программа никогда не выполняет метод OnInteract(), потому что 'if' никогда не берется. – simpel01

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-классификаторов. Это предпочтительный способ создания переменной в диапазоне, основанном на цикле.

+0

К сожалению, у меня все еще есть такая же проблема, однако я также просмотрю свой код и посмотрю, не сделал ли я такую ​​же ошибку где-нибудь еще, что можно было бы исправить. –

 Смежные вопросы

  • Нет связанных вопросов^_^