我有一个Class Character和两个子类Warrior and Wizard。
class Character {
protected:
std::string m_name;
Weapon m_weapon;
int m_life;
public:
virtual void hit(Character& cible);
};
class Warrior : public Character{
public:
Warrior(std::string name);
};
class Wizard : public Character{
public:
Wizard(std::string name);
};
我也有班级武器。
class Weapon {
protected:
std::string m_name;
int m_damage;
public:
Weapon();
Weapon(std::string name,int damage, int reloading_time);
int get_damage() ;
};
点击功能是:
void Character::hit(Character &cible){
cible.dec_life(m_weapon.get_damage());
}
和get_damage只是:
int Weapon::get_damage() {
return m_damage;
}
问题是m_weapon.get_damage()会在每个角色(战士或巫师)的命中函数中返回值-2,即使它的武器伤害是10或15。
主:
int main()
{
string character_name;
cout << "Warrior 1 : ";
cin >> character_name;
Warrior character_1(character_name);
cout << endl << "Wizard 2 : ";
cin >> character_name;
Wizard character_2(character_name);
character_1.hit(character_2);
}
武器构造函数:
Weapon::Weapon(std::string name,int damage, int reloading_time){
m_name=name;
m_damage=damage;
}
战士建构者:
Warrior::Warrior(string name){
m_name=name;
m_life=100;
Weapon m_weapon("Rusted Axe",5,0);
cout << endl << "Warrior " << m_name <<" created." <<endl;
}
向导构造函数:
Wizard::Wizard(string name){
m_name=name;
m_mana=100;
m_life=100;
Weapon m_weapon("Apprentice Wand",10,0);
cout << endl <<"Wizard " << m_name <<" created."<<endl;
}
我知道哪里弄错了?
答案 0 :(得分:1)
您的代码中没有任何地方我看到数字10
和15
。你怎么期望程序知道特定武器的伤害应该是10
或15
?
根据你的代码,类Weapon
有一个接受武器伤害值的构造函数。但是你永远不会使用这个构造函数。相反,您似乎正在使用m_weapon
类的默认构造函数构建Weapon
成员,这只会在m_damage
字段中留下垃圾。
您必须开发一种方法来执行m_weapon
对象的有意义的初始化。在这一点上,你似乎希望编译器以某种方式通过心灵感应来计算出各种武器对象的伤害值。编译器无法做到这一点。
编辑:您在构造函数中执行的操作只是构造一个本地 m_weapon
对象,该对象与成员m_weapon
对象完全无关。您的成员m_weapon
对象保持未初始化状态(即默认情况下使用m_damage
中的垃圾进行初始化)。无法从构造函数体执行成员子对象的初始化。成员子对象只能从构造函数初始化列表中初始化(在C ++书中阅读它或进行搜索)。最重要的是,您只能初始化类的立即成员,这意味着m_weapon
只能从Character
的构造函数初始化。无法从Warrior
或Wizard
的构造函数执行此操作。
答案 1 :(得分:0)
在受保护的部分下的Character
课程中添加一个构造函数,如下所示:
Character::Character(std::string& name, Weapon& weapon)
: m_name(name),
m_weapon(weapon)
{}
然后在你的战士和向导构造函数中执行此操作:
Warrior::Warrior(std::string& name)
: Character(name, Weapon("Rusted Axe",5,0))
{
m_life=100;
cout << endl << "Warrior " << m_name <<" created." <<endl;
}
Wizard::Wizard(std::string& name)
: Character(name, Weapon("Rusted Axe",5,0))
{
m_life=100;
cout << endl << "Wizard " << m_name <<" created." <<endl;
}