Оружие не обязательно является атрибутом игрока. Способность иметь оружие - это (по крайней мере, насколько это касается вашей модели) способность игрока, и это не зависит от типа оружия.
Вы на правильном пути с помощью указателя, но явно что-то сделали не так. Без кода никто не может посоветовать, что вы сделали неправильно.
Я бы представлял возможность иметь пистолет, используя указатель, и установить gun
в качестве полиморфной основы. Это позволяет player
ссылаться на любой тип gun
. Также было бы необходимо обеспечить некоторую операцию, которая позволит player
получить право собственности на gun
.
class gun
{
public:
gun(int a = 0) : ammunition(a) {};
virtual void fire() {--ammunition;};
private:
int ammunition;
};
class pistol : public gun
{
public:
pistol(int a = 0) : gun(a) {};
virtual void fire() {gun::fire(); gun::fire();}; // fire two rounds from a pistol
};
class player
{
public:
player(gun *g = NULL) : p (g) {};
void addGun(gun *g) { p = g;};
void shoot() {p->fire();};
private:
gun *p;
};
int main()
{
pistol pistol(100);
player gun_nut;
gun_nut.addGun(&pistol);;
gun_nut.shoot();
}
Выше приведено довольно статично, и все объекты просто прекратят существовать, когда вернется main()
. Если вы хотите динамически создавать оружие и игроков в своей программе, рассмотрите возможность использования умных указателей (например, std::unique_ptr<gun>
вместо gun *
). Это позволяет динамически создавать оружие разных типов, добавлять его в игрока, и оружие перестает существовать, когда больше не нужно.
Очевидно, что вам нужно будет выполнить другие операции и проверку ошибок (например, оружие не должно стрелять, если из боеприпасов игрок, не имеющий оружия, не должен стрелять из оружия и т. Д. И т. Д.). Также обратите внимание, что я избегал использования защищенных членов - часто это было бы не нужно, если бы вы предоставили подходящие функции-члены, которые контролируют доступ к закрытым членам.