Sugerencia de diseño orientado a objetos

Aquí está mi código:

class Soldier {
public:
   Soldier(const string &name, const Gun &gun);
   string getName();
private:
   Gun gun;
   string name;
};

class Gun {
public:
   void fire();
   void load(int bullets);
   int getBullets();
private:
   int bullets;
}

Necesito llamar a todas las funciones miembro de Gun sobre un objeto Soldier. Algo como:

soldier.gun.fire();

o

soldier.getGun().load(15);

Entonces, ¿cuál es un mejor diseño? Ocultar el objeto de arma como miembro privado y acceder a él con la función getGun (). ¿O haciéndolo miembro público? O puedo encapsular todas estas funciones haría que la implementación sea más difícil:

soldier.loadGun(15); // calls Gun.load()
soldier.fire(); // calls Gun.fire()

Entonces, ¿cuál crees que es el mejor?

Respuestas a la pregunta(9)

Su respuesta a la pregunta