Как правильно инициализировать предопределенные переменные-члены в нескольких объектах? - PullRequest
0 голосов
/ 09 октября 2019

Я не из области ООП, и хотя я полностью понимаю классы, это стилистический вопрос, на который я никогда не нашел удовлетворительного ответа. Скажем, вы делаете видеоигру и определите класс под названием Gun. Он имеет переменные-члены, называемые уроном, скорострельностью и точностью. Есть несколько предопределенных пистолетов, скажем, пистолет, револьвер и пистолет-пулемет. Переменные каждого члена Guns известны во время выполнения и никогда не меняются. Как правильно инициализировать каждое оружие?

Вы можете просто инициализировать их во время выполнения

Gun pistol(10, 10, 10);
Gun revolver(20, 5, 15);
Gun machinePistol(5, 20, 5);

Но мне сказали, что это плохая практика. Вы можете определить каждый из них как новый класс, унаследованный от Gun, а затем инициализировать все их переменные-члены в своих конструкторах, но это довольно многословно, и сложно отслеживать все новые классы.

Вы также можете инициализировать все переменные-члены в одном конструкторе, например:

switch(whichGun)
{
case pistol:
    damage = 10;
    //etc, etc
}

Но для этого требуется некоторый способ идентификации каждого оружия, например, перечисление, которое выдается какгромоздкий.

Какая стандартная практика для этого? Я в основном использую c ++, но я бы предположил, что это относится к большинству OOPL.

1 Ответ

1 голос
/ 09 октября 2019

У вас есть

Gun pistol(10, 10, 10);
Gun revolver(20, 5, 15);
Gun machinePistol(5, 20, 5);

Из вашего поста звучит, что это единственные действительные аргументы для построения Gun. Если это так, то я бы посоветовал:

  1. Добавить public static функций-членов к Gun для создания таких Gun s.
  2. Сделать конструктор изкласс private, так что Gun s не может быть построен другим способом.

class Gun
{
    public:

       static Gun constructPistol();
       static Gun constructRevolver();
       static Gun constructMachinePistol();

    private:

       Gun(int, int, int);
};

Gun Gun::constructPistol() { return Gun(10, 10, 10); }
Gun Gun::constructRevolver() { return Gun(20, 5, 15); }
Gun Gun::constructMachinePistol() { return Gun(5, 20, 5); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...