c++ - Wrong return value when access member of class -


i have class character , 2 subclasses warrior , 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);  }; 

i have class weapon.

class weapon {  protected: std::string m_name; int m_damage; public: weapon(); weapon(std::string name,int damage, int reloading_time); int get_damage() ; 

};

the hit function is:

void character::hit(character &cible){ cible.dec_life(m_weapon.get_damage()); } 

and get_damage simply:

int weapon::get_damage() { return m_damage; } 

the problem m_weapon.get_damage() returns value -2 in hit function every character (warrior or wizard) though weapon's damage 10 or 15.

main:

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 constructor:

weapon::weapon(std::string name,int damage, int reloading_time){ m_name=name; m_damage=damage; } 

warrior constructor:

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 constructor :

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;   } 

any idea wrong?

nowhere in code see numbers 10 , 15. how expect program know specific weapon's damage supposed 10 or 15?

according code, class weapon has constructor accepts weapon's damage value. never use constructor. instead, seem constructing m_weapon members using default constructor of weapon class, leaves garbage in m_damage field.

you have develop way perform meaningful initialization of m_weapon objects. @ point seem hoping compiler somehow telepathically figures out damage values various weapon objects. compilers cannot that.

edit: in constructors construct local m_weapon object, has absolutely no relation member m_weapon object. member m_weapon objects remain uninitialized (i.e. default initialized garbage in m_damage). not possible perform initialization of member subobject constructor body. member subobjects can initialized constructor initializer list (read in c++ book or search). on top of that, allowed initialize immediate members of class, meaning m_weapon can initialized character's constructor. not possible warrior's or wizard's constructor.


Comments

Popular posts from this blog

How to remove text and logo OR add Overflow on Android ActionBar using AppCompat on API 8? -

html - How to style widget with post count different than without post count -

url rewriting - How to redirect a http POST with urlrewritefilter -