初始化派生类虚拟函数返回的内联静态变量的最佳方法。

最初我把m_damage作为基类Projectile中的一个类成员,在每个派生类的初始化列表中赋值,并在基类中设置一个getter函数。

但后来我意识到我不需要每个派生类的实例都持有一个m_damage的副本,因为它对每个派生类的所有实例都是相同的值,所以我需要让这个值成为 static 并让每个派生类以 virtual 函数覆盖。

经过网上和这里的研究,我相信 inline static const 变量是最好的方法。但是把它作为类成员或类常量有什么好处吗,还是有其他更好的方法?我只想通过projectile中的私有虚拟函数来访问这个值。

Projectile.h文件

class Projectile
{
private:
    virtual int getDamage() const = 0;
}

火箭.h文件

class Rocket : public Projectile
{
private:
// inline static const auto ROCKET_DAMAGE = 400;  <---- make it a class member?
    virtual int getDamage() const final override;
}

火箭队

// inline static const auto ROCKET_DAMAGE = 400;  <---- make it a class constant?

int Rocket::getDamage() const
{
    return ROCKET_DAMAGE;
}

解决方案:

从API设计的角度来看,一个常量是一个实现细节。因此,你可能想把这个实现细节–即常量–隐藏在成员函数的定义后面,在基类的 .cpp 文件,因为你已经有了。

rocket.hpp:

class Rocket: public Projectile {
private:
    virtual int getDamage() const final override;
};

rocket.cpp:

static constexpr auto ROCKET_DAMAGE = 400; // not exposed to client

int Rocket::getDamage() const {
    return ROCKET_DAMAGE;
}

注意到有了常数 ROCKET_DAMAGE 作为数据成员,就像下面的例子一样,将其暴露给客户端。

class Rocket: public Projectile {
private:
   inline static const auto ROCKET_DAMAGE = 400;
};

常量可以被编译到客户端的代码中。这意味着每次改变常量的值时,客户端的代码都需要重新编译。ROCKET_DAMAGE.

相反,如果常数 ROCKET_DAMAGE 不会通过头文件暴露给客户端,因为它被隐藏在了 .cpp 文件(如前一种情况),改变常量的值不可能需要重新编译客户端代码。

给TA打赏
共{{data.count}}人
人已打赏
未分类

我在Heroku中设置了时区,但没有任何变化。

2022-9-9 8:26:18

未分类

Jupyter:无法用pyodbc连接到MS SQL Server。

2022-9-9 8:26:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索