Объектно-ориентированное дизайнерское предложение

Вот мой код:

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

Мне нужно вызвать все функции-члены Gun над объектом Soldier. Что-то вроде:

soldier.gun.fire();

или же

soldier.getGun().load(15);

Так какой из них лучший дизайн? Скрытие объекта оружия как частного члена и доступ к нему с помощью функции getGun (). Или сделать его публичным членом? Или я могу инкапсулировать все эти функции, что усложнит реализацию:

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

Так какой из них вы считаете лучшим?