Где хранить именованные константы класса в C++

Если у вас есть класс, который имеет несколько именованных констант, как лучше всего хранить константы:

Вариант 1: пространство имен в заголовке класса

Так что в заголовке моего класса я буду иметь:

class myClass
{
...
...
};

namespace NamedConstants
{
   const string Bucket = "Bucket";
}

Вариант 2 Член Константы

class MyClass {      // this goes in the class
private:                          // header file
  static const string Bucket;
  ...
};

... и в файле реализации класса:

const string MyClass::Bucket = "Bucket";

Я на самом деле предпочитаю вариант 1, считая, что он чище: имя и значение переменной появляются вместе. Кроме того, если вы дадите пространству имен хорошее имя, это может сделать код более читабельным при использовании констант:

TrafficLight::Green

Кто-нибудь видит какие-либо проблемы с этим методом по варианту 2?

2 ответа

Решение

Если строки предназначены для просмотра / использования пользователями класса, вы не захотите их делать private ученики Таким образом, я заключаю, что они не предназначены для просмотра / использования пользователями класса. Но тогда вообще не имеет смысла помещать их в заголовок.

Если вы поместите их в класс (или в область пространства имен в заголовке), то все изменения их типа и идентификатора заставят клиентов перекомпилировать свой код.

Если вы помещаете их в файл реализации класса, они являются частной деталью реализации класса, и изменения в них только вызывают принудительную перекомпиляцию реализации класса.
Если вы поместите их в безымянное пространство имен, они не смогут столкнуться с любым другим именем:

namespace  {
  namespace NamedConstants
  {
     const string Bucket = "Bucket";
  }
}

Вариант 1 может привести к отдельному строковому объекту для каждого файла, который включает заголовок. Так что, среди прочего, это зависит от того, насколько скудны ваши ресурсы.

Другие вопросы по тегам