我应该初始化抽象成员 class 吗?
Should I initialize members of an abstract class?
我想知道初始化抽象成员 class 是否是最佳实践(至少有一个纯虚拟成员函数,可能是 dtor)。另一种选择是在继承 classes.
中进行
正在继承初始化class
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
class IPlayer
{
public:
virtual ~IPlayer() {};
protected:
bool m_alive { true };
};
class Bomber : protected IPlayer
{
public:
Bomb();
~Bomb();
};
我应该更喜欢哪一个,为什么?
严格来说,如果一个成员没有被in-class-initializer、ctor-init-list初始化,在静态/线程存储的情况下class zero-initialization,或者在聚合的情况下value-initialization 或 aggregate-initialization,它将是 default-initialized,这使得 bool
等类型不确定。
您之后可以分配它们,但这不是一回事。
现在我们进入下一部分:
每个 class 都应该尽可能合理地执行自己的不变量。是的,拥有非 private
成员会降低这种能力,但这种便利有时是值得的,它可以转化为更少的副本,从而可能提高效率。
此外,您不应该无谓地重复自己。
因此,使用 in-class 初始化器。
我想知道初始化抽象成员 class 是否是最佳实践(至少有一个纯虚拟成员函数,可能是 dtor)。另一种选择是在继承 classes.
中进行正在继承初始化class
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
class IPlayer
{
public:
virtual ~IPlayer() {};
protected:
bool m_alive { true };
};
class Bomber : protected IPlayer
{
public:
Bomb();
~Bomb();
};
我应该更喜欢哪一个,为什么?
严格来说,如果一个成员没有被in-class-initializer、ctor-init-list初始化,在静态/线程存储的情况下class zero-initialization,或者在聚合的情况下value-initialization 或 aggregate-initialization,它将是 default-initialized,这使得 bool
等类型不确定。
您之后可以分配它们,但这不是一回事。
现在我们进入下一部分:
每个 class 都应该尽可能合理地执行自己的不变量。是的,拥有非 private
成员会降低这种能力,但这种便利有时是值得的,它可以转化为更少的副本,从而可能提高效率。
此外,您不应该无谓地重复自己。
因此,使用 in-class 初始化器。