2011-12-10 4 views
1

私はクラスの最終プロジェクトに取り組んでおり、少し問題があります。私がヒーローやモンスターオブジェクトを作成し、それに値を割り当てると、私はmainのコメントアウトされたセクションでチェックしていたものですが、その情報にアクセスすることはできません。たとえば私がmonster.Attack()と呼ぶ場所で戦う私の機能では、戦士やメイジオブジェクトの名前が空白になります。私がクイック・コウトを実行すると、name、type、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に魔法使いや戦士が、文句を言わないの表示のために減らさ健康を表示することです。

ここでは、私がやった小さな叫びのテストの出力です。トップ4に注目してください。他の4つは、herotype、name、maxHealth、maxManaというオブジェクトを参照しています。

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

は、に変更してみてください:

-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 a_name, int a_maxHealth, int a_maxMana, Hero::e_HeroType a_heroType){ 
     name = a_name; 
     ... 
+0

はい!どうもありがとうございます。私はまだlolvoteを傾けることが信じられない。 – Randallsm83

+0

@ Zer0s0phT私はあなたのためにアップフォートしました。 ;)この問題を回避する一般的なイディオムは、メンバ変数の末尾にアンダースコアを付けることです。名_。 Microsoftの世界のコードによっては、メンバ変数の接頭辞としてm_が表示されることもあります。 –

+0

upvotingもありがとう。 – Randallsm83

関連する問題