2011-12-10 77 views
1

我正在为一个类的最终项目工作,我有点麻烦。当我创建我的英雄或怪物对象并为其赋值时,我正在用main中的注释部分检查这些值,但我无法访问该信息。例如,在我的功能中,打击我称之为怪物的地方。攻击()战士或法师对象的名字出现空白。如果我运行一个快速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,名称,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 

回答

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

是!非常感谢。不能相信我不能upvote还是哈哈。 – Randallsm83

+0

@ Zer0s0phT我以你的名义向上投票。 ;)避免这个问题的一个常见习惯是用尾部下划线来命名你的成员变量,例如,名称_。在一些微软世界的代码中,你也可以看到m_作为成员变量的前缀。 –

+0

明白了!也感谢你的投票。 – Randallsm83