Обход объектов членов - PullRequest
       1

Обход объектов членов

1 голос
/ 11 декабря 2011

Я работаю над финальным проектом для класса, и у меня возникли небольшие проблемы.Когда я создаю свой объект героя или монстра и присваиваю ему значения, что я и проверял в закомментированном разделе в основном, я не могу получить доступ к этой информации.Например, в моей функции сражаться, где я вызываю монстра. Атак () имя объекта воина или мага появляется пустым.Если я запускаю быстрый прыжок, все выглядит хорошо, за исключением членов объектов Героя, таких как имя, тип, maxHealth, maxMana, но появляется имя оружия и т. Д.Любая помощь будет принята с благодарностью!

#include <iostream>
#include <vector>
#include <string>
#include <time.h>
#include <windows.h>

using namespace std;

struct Weapon;
struct Belt;
struct Potion;
struct Ability;
class Hero;
class Monster;
void CreateCharacters(Hero&, Hero&, Monster&);
int ShowMenu();
void Fight(Hero&, Hero&, Monster&);



struct Weapon{
    std::string name;
    int damage;
};

struct Belt{
    std::vector<Potion> contents;
};

struct Potion{
    enum e_Type{Health, Mana} type;

    int amount;
};

struct Ability{
    std::string name;

    enum e_Type{Offensive, Defensive, Neutral} type;    

    int manaCost;
    int amount;
};

class Hero{

public:
    std::string name;   
    int maxHealth;  
    int maxMana;        

public: 
    Weapon weapon;
    Belt belt;
    std::vector<Ability> abilities;
    enum e_HeroType{Warrior, Mage} heroType;
    int health;
    int mana;

    void CreateHero(std::string name, int maxHealth, int maxMana, Hero::e_HeroType heroType){
            name = name;
            maxHealth = maxHealth;
            maxMana = maxMana;
            health = maxHealth;
            mana = maxMana;
            heroType = heroType;
    }
    void CreateWeapon(std::string name, int damage){
        weapon.name = name;
        weapon.damage = damage;
    }
    void FillBelt(Potion::e_Type type, int amount){
        Potion potion;
        potion.type = type;
        potion.amount = amount;
        for (int i = 0; i < 3; i++){
            belt.contents.push_back(potion);
        }
    }
    void CreateAbility(std::string name, Ability::e_Type type, int manaCost, int amount){
        Ability ability;
        ability.name = name;
        ability.type = type;
        ability.manaCost = manaCost;
        ability.amount = amount;
        abilities.push_back(ability);
    }
    void Attack(){}
    void TakeDamage(){}
    void UseItem(){}

};

class Monster{

private:
    std::string name;   
    int maxHealth;

public: 
    int health;
    Weapon weapon;

    void CreateMonster(std::string name, int maxHealth){
            name = name;
            maxHealth = maxHealth;
            health = maxHealth;
    }
    void CreateWeapon(std::string name, int damage){
        weapon.name = name;
        weapon.damage = damage;
    }
    void Attack(Hero &mage, Hero &warrior, Monster &monster){

        std::cout << "The troll takes a random swing!" << endl;
        Sleep(3000);


        srand(time(NULL));
        int randomNumber = rand() % 2 + 1;

        if (randomNumber == 1){
            mage.health -= monster.weapon.damage;
            cout << mage.name << " has been struck!" << endl;
            Sleep(2500);
            cout << "The health of " << mage.name << " has dropped to " << mage.health << endl;
        } else if (randomNumber == 2){
            warrior.health -= monster.weapon.damage;
            cout << warrior.name << " has been struck!" << endl;
            Sleep(2500);
            cout << "The health of " << warrior.name << " has dropped to " << warrior.health << endl;
        }
    }
    void TakeDamage(){}
};

void CreateCharacters(Hero &mage, Hero &warrior, Monster &monster){

    mage.CreateHero("Gandalf", 80, 100, Hero::Mage);
    mage.CreateWeapon("Rod of Ages", 5);
    mage.FillBelt(Potion::Mana, 25);
    mage.CreateAbility("Fireball", Ability::Offensive, 15, 25);
    mage.CreateAbility("Heal", Ability::Defensive, 10, 25);
    warrior.CreateHero("Spartacus", 100, 0, Hero::Warrior);
    warrior.CreateWeapon("The Destroyer", 35);
    warrior.FillBelt(Potion::Health, 25);
    monster.CreateMonster("Trollio", 250);
    monster.CreateWeapon("Mighty Club", 15);
}

int ShowMenu(){

    int choice;

    cout << "\nWelcome to the Battle!" << endl;
    cout << "----------------------" << endl;
    cout << "Please make a choice from the following:" << endl;
    cout << "1. Fight Now!" << endl;
    cout << "2. Quit" << endl;

    cin >> choice;

    return choice;
}

void Fight(Hero &mage, Hero &warrior, Monster &monster){

    std::cout << "\nYou have chosen to fight!" << endl;
    Sleep(3000);
    monster.Attack(mage, warrior, monster);

}

int main(){

    Hero mage;
    Hero warrior;
    Monster monster;

    CreateCharacters(mage, warrior, monster);

    do {
        int choice = ShowMenu();

        if (choice == 1){

            Fight(mage, warrior, monster);

        } else if (choice == 2){

            break;

        }
    } while (true); 

    cin.ignore();
    cin.get();

    return 0;
}

Что меня также смущает, так это то, что функция monster.Attack () правильно отображает здоровье, уменьшенное для мага или воина, но не отображается на бойце.

Вот результат небольшого теста cout, который я сделал, обратите внимание на верхние 4 и примерно на полпути через остальные четыре ссылки на объекты: тип героев, имя, maxHealth и maxMana не регистрируются.

-858993460

-858993460
-858993460
5
Rod of Ages
Fireball
0
25
15
Heal
1
25
10
1
25
1
25
1
25
-858993460

-858993460
-858993460
35
The Destroyer
0
25
0
25
0
25

1 Ответ

2 голосов
/ 11 декабря 2011

Мне кажется, проблема в том, что имена аргументов совпадают с именами переменных-членов:

void CreateHero(std::string name, int maxHealth, int maxMana, Hero::e_HeroType heroType){
        name = name; // Assigning member variable to itself.
        ...

Попробуйте изменить на:

void CreateHero(std::string a_name, int a_maxHealth, int a_maxMana, Hero::e_HeroType a_heroType){
        name = a_name;
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...