Векторные данные сбрасываются? - PullRequest
0 голосов
/ 09 ноября 2011

Продолжение моего предыдущего вопроса, который теперь решен: Проблема с указателями (только в сборке релиза)

После внесения необходимых изменений в способ создания врагов мне также пришлось изменить способы взаимодействия других объектов с врагами по очевидным причинам. Теперь, похоже, я снова что-то делаю не так: /

Здесь у меня есть некоторый код для моих снарядов, который я создаю, чтобы поразить врагов, но этот делает противоположное и останавливает врага на короткий промежуток времени.

if ((enemies[numOfEnemies].position.x + (enemies[numOfEnemies].width / 2) > bullet.position.x && 
            enemies[numOfEnemies].position.x < bullet.position.x + bullet.width) && 
            (enemies[numOfEnemies].position.y + (enemies[numOfEnemies].height / 2) > bullet.position.y &&
            enemies[numOfEnemies].position.y < bullet.position.y + bullet.height) && 
            enemies[numOfEnemies].speed != 0)
        {
            //We've collided with the wall, stop the enemy
            enemies[numOfEnemies].previousSpeed = enemies[numOfEnemies].speed;
            enemies[numOfEnemies].speed = 0;
        }

Как видите, простые вещи. Но похоже, что вектор врагов продолжает сбрасываться, не зная, что здесь происходит. До этого снова работал превосходно, с изменениями, произошедшими после перехода от указателей к векторам, возникла эта проблема: /.

void Towers::Update(std::vector<Enemies> enemies, SDLib& lib, Map cMap)

Вот как я передаю вектор своей функции. Вектор выходит из области видимости и затем очищается автоматически? Если так, то что мне нужно сделать, чтобы назначить изменения, которые я делаю, для фактических данных?

Любая помощь приветствуется!

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

С ++ аргументы функции передача по значению , если не указано иное.Это означает, что ваша функция работает с копией вектора.Чтобы он изменил оригинал, нужно пройти по ссылке:

void Towers::Update(std::vector<Enemies> &enemies, SDLib& lib, Map cMap)
                                         ^
1 голос
/ 09 ноября 2011

Вы передаете вектор своей функции по значению.Таким образом, исходный вектор в вызывающей функции никогда не будет изменен.Попробуйте этот код, который показывает проблему:

#include <vector>
#include <iostream>

int domod(std::vector<int>& v) {
        v[0] = 2;
}

int donotmod(std::vector<int> v) {
        v[0] = 2;
}

int main(void) {
        std::vector<int> v;

        v.push_back(1);

        donotmod(v);
        std::cout << v[0] << std::endl;

        domod(v);
        std::cout << v[0] << std::endl;

        return 0;
}
1 голос
/ 09 ноября 2011

Вы передаете свой std :: vector значением , что означает, что он (включая его содержимое) копируется при каждой передаче в функцию. Если вы хотите, чтобы функция Update () могла изменять (содержимое) вектора, вам нужно передать его по ссылке :

void Towers::Update(std::vector<Enemies> &enemies, SDLib& lib, Map cMap)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...