【问题标题】:Wrong return value when access member of class访问类成员时返回值错误
【发布时间】:2013-09-03 21:24:52
【问题描述】:

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

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;


}

知道我哪里弄错了吗?

【问题讨论】:

  • 您是否将 m_damage 设置为 -2 以外的值?
  • Weapon 构造函数是什么样的?什么时候在角色上设置它?
  • 你能发布你的主要功能吗?
  • @user2744550:这段代码构造了一个本地对象m_weapon,它与类成员m_weapon无关。你不能这样做。

标签: c++ class member


【解决方案1】:

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

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

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

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

【讨论】:

  • 数字 10 qnd 5 用于 Warrior 和 Wizard 构造函数。我用两个构造函数编辑了 OP。
【解决方案2】:

protected 部分下的 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多