Простите, если название недостаточно конкретное. Допустим, я хочу сделать RPG. Я делаю класс для персонажей. Затем я создаю массив, который функционирует как набор символов. Затем у меня есть функция, которая уменьшает HP первого члена группы.
`
#include <iostream>
#include <string>
class Chara
{
public:
int HP;
Chara(int health)
{
HP = health;
}
};
int Battle(Chara Party[2])
{
Party[0].HP -= 2;
}
int main()
{
Chara Final(0);
Chara Fantasy(7);
Chara Player[2] = {Final, Fantasy};
Battle(Player);
std::cout << Final.HP;
}
`
Однако HP персонажа не меняется. Есть ли что-то, что я могу сделать, чтобы HP персонажа действительно менялись?
Обратите внимание, что ваш Battle
был выполнен в массиве с именем Player
, поэтому любые изменения будут отражаться только на элементах этого массива, а не на Final
или Fantasy
У вас есть две отдельные проблемы, вызванные передачей структур C++ путем копирования.
Во-первых, строка Chara Player[2] = {Final, Fantasy};
создает массив Chara
и инициализирует члены копиями упомянутых переменных. Это означает, что в последней строке не будет никаких изменений элементов Player
.
Вместо этого вы должны сделать:
Chara Player[2] = { Chara{0}, Chara{7} };
// and optionally, if you still want to access individual members:
Chara& Final = Player[0];
Chara& Fantasy = Player[1];
Во-вторых, вы передаете Player
функции Battle
путем копирования. Таким образом, любые изменения, внесенные в Party
внутри функции, не отражаются во внешней переменной Player
.
Быстрое решение состоит в том, чтобы взять Party
по указателю:
void Battle(Chara* Party) { ... }
Это работает, потому что массивы могут распадаться на указатели на их первый элемент при передаче.
В качестве наилучшей практики вам, вероятно, следует использовать вместо этого std::vector
, который позволяет вам динамически добавлять и удалять членов группы и имеет всевозможные полезные методы.
Вы имели в виду в объявлении: Chara Player[2] = { Chara {0}, Chara {7} }
?
Да, спасибо, что заметили это.
Кристально чистый. +1
int Battle(...)
— возможно, вы имели в виду:void Battle(...)
с параметром в качестве передачи по ссылке.