Это зависит от ситуации.
Константы относятся к классу Human, поэтому вполне понятно, что они им "принадлежат", а использование имен в пространстве имен (Human :: NUM_ARMS) делает их использование однозначным. (Представьте себе, что произойдет, если вы введете новые классы, такие как Octopus. Вы бы использовали Octopus :: NUM_ARMS, что было бы 8, а не 2. Слава Богу за локализованные имена классов / пространств имен!)
Конечно, в ситуации Human / Octopus вы можете пересмотреть использование констант и вместо этого использовать класс / интерфейс Animal с виртуальным методом GetNumArms (), который каждый может переопределить. Это позволит вашему клиентскому коду слабо сочетаться с человеком и осьминогом и хорошо работать для обоих типов животных. Это позволило бы основным константам быть закрытыми для каждого из этих классов.
Или, если вы пишете код в другом направлении, подумайте, что вычисляет внешний класс. Чьей ответственностью должен быть этот расчет? Возможно, вам следует добавить расчет к классу людей (например, Human::GetNumLimbs()
, Human::GetNumBodyParts()
)
Наконец, мы все перешли с 1970-х годов, поэтому я бы порекомендовал использовать более удобочитаемый стиль для констант (например, Human::cNumFeet
вызывает гораздо меньшее кровотечение из глаз, чем Human::NUM_FEET
, и его не легко принять за любые макросы, которые у вас есть)