另一个问题:通过引用传递参数

时间:2011-11-18 13:23:50

标签: c++ reference

所以我认为我有通过引用传递下来的想法,但似乎我仍然在努力解决它。

这是我的问题,我已经调试了一段时间的游戏,并且我的代码中的敌人部分未触及多年。这是一个很长的故事,但我认为我的射弹对敌人造成了伤害,我将敌人的生命变为非常高,所以我认为他们正在造成伤害,但是由于身体健康,而不是杀死它。直到现在我才意识到他们没有造成任何损害并且代码错误:/

所以这是我的开始:

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

这里我通过引用将敌人传递到我的更新功能中。然后我去看看塔内是否有任何敌人;

for (int numOfEnemies = 0; numOfEnemies < lib.numberOfEnemies; numOfEnemies++)
{
    float y =  pow(enemies[numOfEnemies].position.y - position.y, 2);
    float x = pow(enemies[numOfEnemies].position.x - position.x, 2);

    if (sqrt(y + x) < range && enemies[numOfEnemies].alive)
    {
        cEnemy = enemies[numOfEnemies];
        acquiredTarget = true;
        break;
    }
}

cEnemy(currentEnemy),然后持有范围内的敌人。在此之后,我创造了射击的射弹,这就是我认为我搞砸了;

bullet = Projectile((float)position.x, (float)position.y - 8, 8, 8, 0, 0, damage, 1, speed, cEnemy);

它的函数参数是:

Projectile::Projectile(float x, float y, int w, int h, int sX, int sY, int dmg, int type, float mxSpeed, Enemies bulletTarget)
{
     //....other values set. 
     target = bulletTarget;
}

(目标如下)

Enemies target;

这里的想法是目标应该通过函数保存对我设置的初始敌人的引用......但它不能按我的意愿工作。 我不太确定,但我猜这里可能需要某种形式的指针。这似乎超出了我发现最难掌握的一切概念,并且已经做了一段时间了。

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:1)

您正在制作Enemies对象的副本:

  • cEnemy = enemies[numOfEnemies];
  • 将值传递给Projectile构造函数时,因为它需要Enemies个值。
  • target = bulletTarget;

要解决所有这些问题,您需要考虑“拥有”Enemies对象的代码,并确保它对于尝试使用它的所有代码都足够长。如果有这样的地方,所有其他地方应该使用引用或指针。如果没有,也许你可以对shared_ptr<Enemies>负责。

答案 1 :(得分:0)

我们在这里缺少一些信息,但可能导致这一点的一行是:

cEnemy = enemies[numOfEnemies];

我不知道cEnemy的类型是什么,但似乎你是从列表中复制你的敌人对象,而不仅仅是引用它。

您知道吗?您可以创建这样的本地参考:

Enemies& cEnemy = enemies[numOfEnemis];

也就是说,cEnemy将引用列表中的敌人,而不是副本。

如果你这样做,请注意,因为cEnemy只是一个参考,如果你修改你的列表,这个引用可能会无声地丢失。

您确定Enemies课程应该可以复印吗?如果它不应该,那么修复它不是可复制的将使编译器成为你找到这样的错误的最好的朋友&#34;。

答案 2 :(得分:0)

您将Enemies参数按值传递给Projectile构造函数,然后按值存储它。

如果您希望target成为cEnemy的引用,则两者都需要引用。另请注意,引用成员必须在构造函数的初始化列表中初始化,因为它们不能像代码那样在正文中重新分配。

class Projectile 
{
public:
    Projectile(/*lots of args*/, Enemies & target) :
        target(target)
    {}

private:
    Enemies & target;
};

答案 3 :(得分:0)

您的问题缺少有关cEnemy类型以及您如何使用目标的一些信息,因此我猜测cEnemy被定义为Enemies,您需要{{1}的参考}更新正确的对象。在这种情况下,您的问题如下:

  1. target制作副本而非参考
  2. 由于cEnemy = enemies[numOfEnemies];类型为bulletTarget Enemies,所以
  3. 由于bullet = Projectile((float)position.x, (float)position.y - 8, 8, 8, 0, 0, damage, 1, speed, cEnemy);target Enemies类型的副本
  4. 引用通常仅在构造地址时获取地址,以后的分配进行复制。因此,要解决第一项需要使target = bulletTarget;成为指针:

    cEnemy

    第二项可以通过将构造函数定义为

    来解决
    Enemies* cEnemy;
    //some code
    cEnemy = &enemies[numOfEnemies];
    //some more code
    

    第三项可以通过将目标定义为参考并在初始化列表中初始化(最后一部分很重要)来解决,使其成为

    Projectile::Projectile(float x, float y, int w, int h, int sX, int sY, int dmg, int type, float mxSpeed, Enemies& bulletTarget)
    

    由于对引用的赋值是一个复制操作(只有引用的构造接受了地址,如果你不能在初始化列表中初始化Enemies& target; Projectile::Projectile(float x, float y, int w, int h, int sX, int sY, int dmg, int type, float mxSpeed, Enemies& bulletTarget):target(bulletTarget) {} ,你需要将它作为一个指针:

    target

    `