C ++ Проблема со смешением композиции и наследования - PullRequest
0 голосов
/ 02 ноября 2018

Я должен составить программу для университета, и у меня возникают проблемы с использованием объекта в качестве атрибута для моего "игрока класса {}". Объект, который я должен использовать, наследуется от родительского объекта и имеет одного родного брата: «gun: machinegun» и «gun: gun».

Я понимаю основы композиции, но не могу понять, как это реализовать.

Например:

class player {protected: gun p; };
class gun {protected: int amunition;};
class pistol : public gun {};

Затем, когда я создаю игроков, у каждого игрока должно быть одно из возможных орудий; но я не знаю, как это сделать.

Я не смог найти информацию в интернете, потому что примеры не используют подкласс в качестве атрибута; Я думаю, что разумом было бы смешать «если» с новым пулеметом или новым пистолетом, но я не уверен.

Я также попытался использовать указатель в аргументе вместо создания экземпляра объекта, а затем назначить новый в if; но он не скомпилировался, но, возможно, потому что произошла другая ошибка Если бы кто-то мог дать мне какой-нибудь совет, он избавил бы меня от наших ошибок.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

прежде всего, если ваш код выглядит так

class player {protected: gun p; };
class gun {protected: int amunition;};
class pistol : public gun {};

или если у вас нет предварительного объявления, компилятор выдаст ошибку при компиляции правильного объявления:

class gun {protected: int amunition;};

class player {protected: gun p; };

class pistol : public gun {};

int main(){
    player p;
}

в дополнение к этому в общественных целях вы не сможете использовать объект оружия на своем классе игрока потому что он защищен, вам нужно иметь общедоступный метод для вашего класса или переместить туда объект оружия.

Примером может быть:

class player 
{
    protected: gun p; 
    public:
    const gun& get_gun(){
        return p;
    }    
};
or

class player{
    public:
    gun p;
};
0 голосов
/ 02 ноября 2018

Оружие не обязательно является атрибутом игрока. Способность иметь оружие - это (по крайней мере, насколько это касается вашей модели) способность игрока, и это не зависит от типа оружия.

Вы на правильном пути с помощью указателя, но явно что-то сделали не так. Без кода никто не может посоветовать, что вы сделали неправильно.

Я бы представлял возможность иметь пистолет, используя указатель, и установить 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 *). Это позволяет динамически создавать оружие разных типов, добавлять его в игрока, и оружие перестает существовать, когда больше не нужно.

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

...