矢量数据被重置?

时间:2011-11-08 23:42:20

标签: c++ vector

继承我之前已经解决的问题: Issue with Pointers (Only in Release Build)

在对我创造敌人的方式进行必要的更改后,我还必须改变其他物体与敌人的交互方式,原因很明显。 现在,似乎我再次做错了:/

在这里,我有一些代码可以用来制造击中敌人的射弹,但这个代码反过来并在短时间内阻挡了敌人。

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 个答案:

答案 0 :(得分:3)

除非另有说明,否则C ++函数参数是按值传递。这意味着您的函数在向量的副本上运行。要让它修改原文,您需要通过引用传递:

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

答案 1 :(得分:1)

您正在按值传递std :: vector ,这意味着每次传递给函数时都会复制它(包括其内容)。如果您希望Update()函数能够更改向量(内容),则需要通过引用传递

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

其余代码很可能保持不变,因为引用 - 而不是指针 - 不需要显式解除引用。

答案 2 :(得分:1)

您通过值将向量传递给函数。因此,调用函数中的原始向量将永远不会被修改。试试这个显示问题的代码:

#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;
}