класс — Переполнение стека производных классов

Я работаю над текстовой игрой для развлечения и борюсь с наследованием
из базового класса. У меня есть базовый класс Being который содержит всю статистику для
какой бы персонаж я ни создал. Тогда у меня есть класс Combat что я хочу взять
все статистические данные от Being (Или из Существа и передать его в бой?) И сделать
все боевые штучки. Но я не совсем понимаю наследство, или, по крайней мере,
как объявить функции в Main заставить его работать. Если я продолжу атаку
функция в BeingЯ могу просто написать эту строку в главном:

human.attack(monster);

Но после разделения боя на другой класс, я не уверен, как написать
что в основном так работает. пожалуйста & Спасибо за помощь!

class Being // Base Class
{
public:

string name, nameSpecialAttack; // Implement a special attack feature,
// that has a specific mutliplier #
// unique to each being
int attackBonus, attackMod; // was a float attackMod method for casting
// spells that double or halve a Being’s
// attack power.
int baseDamage; // base damage
int health, healthMax; // current health and max health
int mp, mpMax; // current mp and max mp
int arrows; // change to [ranged?] ammo

Being(); // Default Constructor
Being(string name, string nameSpecialAttack, int attackBonus,
int attackMod, int baseDamage, int health, int healthMax,
int mp, int mpMax, int arrows); // Constructor 2
// All my set and get functions
}

Тогда мой производный класс:

class Combat : public Being
{
private:

public:

void attack(Being& target);

};

Combat.cpp:

void Combat::attack(Being& target)
{
//unsigned seed = time(0);
//srand(seed);
// Rand # 0-99, * damage+1, /100, * attackMod, parse to int.
int damage = (int)(attackMod*( ( (rand()%100)*(baseDamage+1) /100) + attackBonus + (rand()%2)));
target.health -=damage;

cout << name << " attacks " << target.name << " doing " << damage << " damage!" << endl;
cout << target.name << "'s health: " << target.health << endl;

// Use getHealth() instead and put this function there
if(target.health <= 0)
{
cout << endl << name << " killed " << target.name << "! You have won the game! " << endl << endl;
cout << "Terminating AMnew World, Good Bye.\n" << endl << endl;
exit(0);
}
}

Главный:

Being human("", "FirstofFurry", 2, 1, 2, 50, 50, 20, 30, 7); // A thing of
// class Being
Being monster("Armored Goblin", "Rawr", 2, 1, 2, 65, 59, 20, 20, 6);

int main()
{
human.attack(monster); // No longer works since attack is in
// combat class now
Sleep(3000);
cout << endl << endl;
monster.attack(human);
}

1

Решение

Это не было бы чем-то, что вы хотели бы получить в наследство, бой не был бы типом существования. Например, яблоко — это фрукт, поэтому базовый класс фруктов и класс, производный от яблок, будут логически правильными. Я бы порекомендовал создать класс противника и класс героя, получая монстров, таких как зомби и ниндзя, от врага.

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

class Character
{
public:
Character(){}     //does nothing, just represents the heros class
};

class Enemy
{
private:
int Health;         //base class variables
int WeaponID;
public:
Enemy(int hp, int wpID);
virtual void Attack(Character& Target); //if all monsters have same attack, no need for virtual
//etc...etc...
};

class Zombie:public Enemy               //DERIVED CLASS, uses base class attack method
{
public:
Zombie(int hp, int wpID):
Enemy(hp,wpID)
{}
};

class Ninja: public Enemy               //DERIVED CLASS, uses its own attack method
{
private:
int NumThrowingKnives;
public:
Ninja(int Hp , int ID) : Enemy(Hp,ID)
{}
void Attack(Character& Target); //different attack
//etc..etc..

};

Enemy::Enemy(int hp, int wpID)
{
Health = hp;
WeaponID = wpID;
}

void Ninja::Attack(Character& Target)
{
cout << "Ninja attack!" << endl;
}

void Enemy::Attack(Character& Target)
{
cout << "Base class attack!" << endl;
}

int main()
{
Character Bob;
Ninja Bill(50,12);
Zombie Rob(50,16);
Bill.Attack(Bob);
cout << endl;
Rob.Attack(Bob);}
3

Другие решения

Не похоже, что вы правильно используете наследование, если не верно следующее:

В вашей игре есть различие между существами, которые могут атаковать, и существами, которые не могут. Тем не менее, изменение иерархии наследования может быть полезным.

Подумайте о том, чтобы сделать «тип» того, чем вы наследуете.

Пример:

class Being
{
public:
virtual void attack(...) = 0;
};

class Human : public Being
{
public:
virtual void attack(...); // Overrides attack in a manner that humans generally would
};

class Goblin : public Being
{
public:
virtual void attack(...); // Goblin attack style. This is actually a decent way to handle different types of attacks, as in the special attack in your above definition
};
3

Почему бы вам не объявить human быть типом Combat вместо?

Combat human("", "FirstofFurry", 2, 1, 2, 50, 50, 20, 30, 7);

Он по-прежнему имеет доступ ко всем открытым методам / данным Being, но также можно использовать Combat-только attack метод.

1
По вопросам рекламы [email protected]