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
是!非常感谢。不能相信我不能upvote还是哈哈。 – Randallsm83
@ Zer0s0phT我以你的名义向上投票。 ;)避免这个问题的一个常见习惯是用尾部下划线来命名你的成员变量,例如,名称_。在一些微软世界的代码中,你也可以看到m_作为成员变量的前缀。 –
明白了!也感谢你的投票。 – Randallsm83