gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:48:04 27 4
gpt4 key购买 nike

最初,我将 m_damage 作为基类 Projectile 中的类成员,在每个派生类的初始值设定项列表中分配了值,并且在基类中有一个 getter 函数。

但后来我意识到我不需要派生类的每个实例都持有 m_damage 的拷贝,因为它对于每个派生类的所有实例都是相同的值,所以我需要将值设为 static。并让每个派生类在 virtual 中返回它功能覆盖。

经过网上和这里的研究,我相信inline static const变量是要走的路。但是将它作为类成员或类常量有什么好处吗?或者还有其他更好的方法吗?我只想要通过 Projectile 中的私有(private)虚函数访问的值。

弹丸.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;
}

火箭 .cpp 文件

// 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 中文件(与前一种情况一样),更改常量的值不可能需要重新编译客户端代码。

关于c++ - 初始化派生类虚函数返回的内联静态变量的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61411685/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com