С точки зрения разработки API константа - это деталь реализации. Поэтому вы можете захотеть скрыть эту деталь реализации - то есть константу - за определением функции-члена в файле .cpp
, как у вас уже есть.
В rocket.hpp
:
class Rocket: public Projectile {
private:
virtual int getDamage() const final override;
};
In 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
(как и в предыдущем случае), изменение значения константы не может потребовать перекомпиляции клиентского кода.