Я пытаюсь сделать небольшую игру про покемонов, которая, очевидно, включает в себя нападение на другого покемона. Не беспокойтесь о Типе; это просто ENUM.
В настоящее время не работает: состояние _reciever не меняется, ошибок нет.
Мой текущий не рабочий код:
class Pokemon
{
public:
string Name;
Type Type;
int Health;
Pokemon(string _name, Pokemons::Type _type, int _health)
{
Name = _name;
Type = _type;
Health = _health;
}
bool checkHealth()
{
if (Health <= 0)
{
return false;
}
return true;
}
void updateHealth(char _operator, int _amount)
{
switch (_operator)
{
case '+':
Health = Health + _amount;
break;
case '-':
Health = Health - _amount;
break;
case '*':
Health = Health * _amount;
break;
case '/':
Health = Health / _amount;
break;
}
}
void attackEnemy(Pokemon _reciever)
{
_reciever.Health = _reciever.Health - 5;
}
};
#include <iostream>
#include "Pokemon.h"
using namespace std;
using namespace Pokemons;
int main()
{
Pokemon Charmender("Charmender", Fire, 45);
Pokemon Bulbasaur("Bulbasaur", Water, 50);
while (true) {
Charmender.attackEnemy(Bulbasaur);
cout << Bulbasaur.Health << endl;
}
}
Ps: это мой первый вопрос о стеке, дайте мне знать, если я что-то пропустил
Я бы предпочел создать общедоступный метод takeDamage(float damage), чтобы каждое существо могло вычислить, сколько урона оно получило (например, если вы позже реализуете какую-то механику «брони», тогда takeDamage будет внутренне уменьшать урон на некоторое значение перед вычитанием из здоровья
Вы пытаетесь изучить C++, исходя из фона Java или C#?
Привет Сэм, это правильно, я некоторое время использую C#
@RickHuisman Я некоторое время использую C# - это может объяснить, почему вы сделали ошибку, которую сделали. Передача таких параметров в C++ сильно отличается от C#. В C++ вы должны явно указать, что вы передаете объект по ссылке (поэтому поведение похоже на C#) — автоматически не предполагается, что вы хотите это сделать. Кроме того, это указывает на то, что вы используете C# в качестве модели при написании кода C++. Не делайте этого, так как вы сами видите, в какой беспорядок вы попадаете, пытаясь выполнить построчный перевод с C# (или любого другого языка) на C++.
Привет, Пол и Тим. Ваш комбинированный ответ устранил проблему, как я могу установить, что это исправление?
В этом случае вы окажете себе огромную услугу, если забудете все, что знали о C#, пока изучаете C++. C++ — это не C#, и он работает принципиально по-другому, например, в этой конкретной проблеме: в C++ все параметры функции передаются по значению. Предположение, что что-то работает в C++, потому что оно выглядит почти так же, как что-то выглядит в C#, всегда заканчивается плачевно.
Спасибо, Пол, я буду иметь это в виду, и, кстати, отличное время отклика!
@RickHuisman - FWIW, передача параметров всегда будет сбивать с толку начинающего программиста на C++, который знает C# или Java, но не читал внимательно о том, как работает C++, когда дело доходит до передачи параметров. И то же самое можно сказать и наоборот: программист на C++, который пишет код на C# или Java, ожидая, что функция будет работать в локальной копии, также с треском провалится.
На самом деле не все параметры в C# передаются по ссылке. Просто все объекты в C# на самом деле являются указателями, а не реальными объектами (Java работает точно так же). И указатели передаются по значению. Эквивалентный код C++ будет работать точно так же.
Лично я согласен с тем, что «вы сделаете себе огромную, огромную услугу, если забудете все, что знаете о C#». Верно, обратно в мою коробку.
В настоящее время вы без проблем обращаетесь к другим переменным-членам класса, но ваши изменения не соответствуют назначению, потому что вы передаете копию объекта:
void attackEnemy(Pokemon _reciever)
{
_reciever.Health = _reciever.Health - 5;
}
При таком подходе _receiver уходит в конце вашего метода. Чтобы получить постоянные изменения, вы можете передать по ссылке:
void attackEnemy(Pokemon &_reciever)
{
_reciever.Health = _reciever.Health - 5;
}
void attackEnemy(Pokemon _reciever)
-- Вы передаете_reciever
по значению, что означает, что функцияattackEnemy
работает с локальной копией, которая исчезает, как только эта функция возвращается. Другими словами, функцияBulbasaur
не влияет наmain
. Но это должно быть описано в любой хорошей книге по C++, прямо в главах, посвященных передаче параметров.