Sugestão de design orientado a objetos

Aqui está o meu 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;
}

Eu preciso chamar todas as funções de membro de Gun sobre um objeto Soldier. Algo como:

soldier.gun.fire();

ou

soldier.getGun().load(15);

Então, qual é um design melhor? Ocultando o objeto gun como um membro privado e acessando-o com a função getGun (). Ou torná-lo um membro público? Ou posso encapsular todas essas funções dificultariam a implementação:

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

Então, qual você acha que é o melhor?