-1

我有一个角色类和两个子类战士和巫师。

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() 在 hit 函数中为每个角色(战士或法师)返回值 -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;


}

知道我哪里弄错了吗?

4

2 回答 2

1

在您的代码中,我没有看到数字1015. 您如何期望程序知道特定武器的伤害应该是1015

根据您的代码,类Weapon有一个接受武器伤害值的构造函数。但是你永远不会使用这个构造函数。相反,您似乎正在m_weapon使用类的默认构造函数来构造成员,这只会在字段中Weapon留下垃圾。m_damage

您必须开发一种方法来对您的m_weapon对象执行有意义的初始化。在这一点上,您似乎希望编译器以某种方式通过心灵感应计算出各种武器对象的伤害值。编译器无法做到这一点。

编辑:您在构造函数中所做的只是构造一个本地 m_weapon对象,它与成员m_weapon对象绝对没有关系。您的成员m_weapon对象保持未初始化(即默认初始化为垃圾m_damage)。无法从构造函数主体执行成员子对象的初始化。成员子对象只能从构造函数初始化器列表中初始化(在您的 C++ 书籍中阅读或进行搜索)。最重要的是,您只能初始化类的直接成员,这意味着m_weapon只能从Character的构造函数初始化。Warrior从' 或Wizard' 构造函数中是不可能的。

于 2013-09-03T22:08:18.733 回答
0

在受保护部分下的Character类中添加一个构造函数,如下所示:

Character::Character(std::string& name, Weapon& weapon)
:    m_name(name),
     m_weapon(weapon)
{}

然后在您的 Warrior 和 Wizard 构造函数中执行以下操作:

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;
}
于 2013-09-04T17:14:51.940 回答