绕过对象成员

时间:2011-12-10 20:29:05

标签: c++ object

我正在为课堂上的最后一个项目工作,我遇到了一些麻烦。当我创建我的英雄或怪物对象并为其分配值时,我正在使用main中已注释的部分进行检查,我无法访问该信息。例如,在我的函数中,我称之为怪物.Attack()战士或法师对象的名称出现空白。如果我运行快速cout一切看起来不错,除了名称,类型,maxHealth,maxMana等Hero对象成员,但武器名称等显示出来。任何帮助将不胜感激!

#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上。

这是我做过的小cout测试的输出,注意前4位,其他四位参考对象herotype,name,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 个答案:

答案 0 :(得分:2)

我认为问题是参数名称与您的成员变量名称相同:

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;
        ...