I have this class named soldier,in my project every soldier must have a weapon,and I have 5 different types of weapons,every class of the weapon types inherited from the 'weapon' class. how can I make a constructor in the soldier class so that the soldier can get any type of weapon? I thought about making 5 different constructors for every type of weapon but that doesn't make much sense
Asked
Active
Viewed 171 times
-3
-
4[Get a couple of good beginners books](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) and read about inheritance and *polymorphism*. – Some programmer dude Dec 30 '17 at 13:24
-
Have a constructor that accepts a `Weapon` by reference or pointer (or smart equivalents), and then registers the weapon provided somehow. Look up polymorphism. – Peter Dec 30 '17 at 13:25
-
@Peter like this soldier(Weapon &weapon)? – Liana Dec 30 '17 at 13:28
-
@Liana - that's one way (at least, in terms of argument list of a constructor). – Peter Dec 30 '17 at 13:32
2 Answers
0
Say the Weapon is the base class of all weapons. Say you have 2 weapon types Gun and Knife:
class Weapon { virtual void shot() = 0; }
class Gun : public Weapon { virtual void shot() { cout << "Gun"; }
class Knife : public Weapon { virtual void shot() { cout << "Knife"; }
class Soldier {
Weapon *weapon;
public:
Soldier() : weapon(nullptr) {}
Soldier(Weapon* w) : weapon(w) {}
void SetWeapon(Weapon* w) { weapon = w; }
Weapon* GetWeapon() { return weapon; }
}
In a Real word code you would consider RAII or smart_pointers for holding and deleting Weapon* objects, otherwise memory leaks could occur.

StPiere
- 4,113
- 15
- 24
-2
On your Soldier class you can have the following:
#include "weapon.h"
class Soldier {
Weapon *weapon;
public:
Soldier(Weapon *weapon) {
this->weapon = weapon;
}
};
When you are going to instanciate the class soldier:
Weapon *w1 = new Knife(), *w2 = new M1();
Soldier s1(w1), s2(w2);

kato2
- 535
- 4
- 15
-
Please, if you are going to down vote my answer, leave a comment, explaining why. I don't understand because people down vote my answer. – kato2 Jan 01 '18 at 16:58