【问题标题】:Should I initialize members of an abstract class?我应该初始化抽象类的成员吗?
【发布时间】:2019-06-04 08:45:33
【问题描述】:

我想知道初始化抽象类的成员是否是最佳实践(至少有一个纯虚拟成员函数,可能是 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();
};

我应该更喜欢哪一个,为什么?

【问题讨论】:

  • IPlayer 提供一个protected 构造函数,它将执行正确的初始化,并最终隐藏m_alive
  • 一般来说,没有关键的区别。如果您在父类中实例化它,则将其视为类的默认初始化。顺便说一句,您不应该在受保护模式下继承 IPlayer,因为这样您就无法通过标准方式对其进行转换。

标签: c++ c++11 inheritance initialization abstract-class


【解决方案1】:

严格来说,如果一个成员没有被in-class-initializer,ctor-init-list初始化,在静态/线程存储类零初始化的情况下,或者在聚合值初始化或聚合初始化的情况下,它将被默认初始化,从而使 bool 等类型不确定。

可以之后分配它们,但这不是一回事。

现在我们进入下一部分:
每个类都应尽可能合理地执行其自己的不变量。是的,拥有非private 成员会降低这种能力,但可以转化为更少的副本从而潜在地提高效率的便利有时是值得的。

另外,你不应该不必要地重复自己。

所以,使用类内初始化器。

【讨论】:

  • IPlayer::IPlayer() : m_alive(true) { }
  • @Bart 那将使用ctor-init-list,是的。就个人而言,我更喜欢类内初始化程序。
猜你喜欢
  • 2017-08-16
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多