Передача объекта по ссылке в функцию не изменяет этот объект - PullRequest
1 голос
/ 27 апреля 2020

так что я пытаюсь передать объект своей функции Attack():

void Character::Attack(Character &another, short int range)
{
    if (EnemyInRange(range) && another.health > 0)
    {
        if (allowed_to_attack)
        {
            attacked = true;

            cout << name << " attacked " << another.name << " taking " << attack << " damage" << endl;


            if (another.defensive > 0) // less important things down there
            {
                another.defensive--;

                if (attack > another.defensive)
                {
                    another.health -= (attack - another.defensive);
                }
            }
            else if (another.defensive == 0)
            {
                another.health -= attack;
            }


            if (another.defensive <= 0)
                another.defensive = 0;

            if (another.health <= 0)
            {
                another.health = 0;
                another.draw = false;
                another.~Character();
            }

        }

        else
        {
            attacked = false;
            cout << "Blocked" << endl;
        }

    }
    else
        cout << name << " wanted to attack " << another.name << " ,but he's out of the range" << endl;

Как видите, я использую ссылку для передачи объекта. НО, когда я вызываю эту функцию:

void onClick(Vector2f mouse_position, Character current, Character *& target, Position &positionx)
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if ((mouse_position.x >= 245 + i * 164 && mouse_position.x <= 370 + i * 164) &&
                (mouse_position.y >= 56 + j * 201 && mouse_position.y <= 221 + j * 201))
            { // there's a 2d map with cards on those positions
                target = &positionx.positioning[i][j];
                current.Attack(*target);
            }
        }
    }

}

позиционирование - это массив, заполненный символами

Он ведет себя так, как будто я передал копию объекта-цели (пишет имя, но это не меняет его здоровье)

в main () это выглядит так:

Character *current = new Character();
Character *target = NULL;

if ((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == Mouse::Left))//SFML lib
{
    Vector2i pos = Mouse::getPosition(window);
    Vector2f position = (Vector2f)pos;
    onClick(position, *current, target, positionx);
} // target is selected after clicking on it

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

В функции onClick переменная current передается по значению, а не по ссылке. Я предполагаю, что предполагается передать по ссылке:

void onClick(Vector2f mouse_position, Character &current, Character *target, Position &positionx)

Обратите внимание, что аргумент current был обновлен до ссылки.

Редактировать:

Просмотр тело функции Attack, если встречается строка, выводящая имя, вы уверены, что условные операторы if if(another.defensive > 0) и if(attack > another.defensive) выполнены?

0 голосов
/ 27 апреля 2020

Как вы думаете, Position &positionx может быть проблемой здесь? Наиболее важной частью функции onClick() является target = &positionx.positioning[i][j]. Но он передается по ссылке, поэтому он не должен создавать проблемы.

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