Должен ли я инициализировать членов абстрактного класса? - PullRequest
2 голосов
/ 04 июня 2019

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

Инициализация в наследуемом классе

class IPlayer
{
public:
        virtual ~IPlayer() {};

protected:
        bool m_alive;
};

class Bomber : protected IPlayer
{
public:
        Bomb(bool t_alive = true)
        {
                m_alive = t_alive;
        }
        ~Bomb();
};

Инициализация в родительском, абстрактном классе

class IPlayer
{
public:
        virtual ~IPlayer() {};

protected:
        bool m_alive { true };
};

class Bomber : protected IPlayer
{
public:
        Bomb();
        ~Bomb();
};

Какой из них я предпочитаю и почему?

1 Ответ

2 голосов
/ 04 июня 2019

Строго говоря, если элемент не инициализируется с помощью in-class-initializer, ctor-init-list, в случае статической / потоковой инициализации нулевого класса хранения или в случае инициализации значения агрегатов или инициализации агрегата, он будет инициализирован по умолчанию, что оставляет типы типа bool неопределенными.

Вы можете впоследствии назначить их, но это не одно и то же.

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

Кроме того, вы не должны повторяться без необходимости.

Итак, используйте инициализатор в классе.

...