Где вы должны помещать глобальные константы в программу на С++?

Где бы вы поместили глобальные константы в приложение С++? Например, вы бы поместили их в класс? В структуре?

Ответы

Ответ 1

Я бы использовал пространство имен для глобальных констант, которые не очень сильно связаны с одним классом. В последнем случае я бы поставил их в этот класс.

Действительно, глобальные (прикладные) константы должны быть в пространстве имен приложений (если ваше приложение находится внутри собственного пространства имен, как и должно быть). Для констант уровня модуля собственное пространство имен модулей является естественным местом.

Ответ 2

Лучший подход - разместить их в одном и том же пространстве имен, где они принадлежат. Большое приложение на С++, как правило, имеет много модулей, каждый из которых имеет свой собственный набор констант. Каждый модуль должен находиться в пространстве имен с его константами в нем.

Ответ 3

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

namespace {
   int const seconds_per_minute = 60;
   int const minutes_per_hour   = 60;
}

Для констант, которые должны быть видимыми для всей программы, самым простым решением является создание имменованного namspace для них и поместить это в заголовочный файл.

Если есть (или могут быть) некоторые операции с ними, вместо этого вы должны создать для них singleton class. Например, довольно распространено, что мои программы имеют одноэлементный класс с именем "конфигурация", который считывает константы запуска (такие вещи, как IP-адреса и вещи, которые я не совсем хочу жестко-кодировать) из файла конфигурации или реестра или чего-то еще как это.

Ответ 4

Как простое эмпирическое правило, я помещаю их в любое место, в результате чего у них нет раздражающих префиксов стиля C.

Так, например, если ваши константы имеют имя mylib_foo, mylib_bar, то они должны быть в пространстве имен mylib и be mylib::foo и mylib::bar.

Если пространство имен mylib содержит константы circle_max_radius, sphere_max_radius, rectangle_max_width, rectangle_max_height, где Circle, Sphere и Rectangle являются классами, тогда они должны быть статическими членами класса.

max не является "раздражающим" префиксом, он довольно разумный, поскольку он описательный модификатор, а не притяжательный ( "максимальный радиус круга" ). Так что он может остаться.

Ответ 5

Один из возможных способов - это класс со статическими функциями-членами, которые возвращают константы. Я использую это, когда мне нужны константы, которые больше, чем базовые типы или простые объекты.

class Constant
{
public:
     static const ComplexObject& getComplexObject()
     {
          static ComplexObject constObj = createComplexObject();
          return constObj;
     }
private:
     static ComplexObject createComplexObject()
     {
         ComplexObject obj;
         obj.setValue(1);
         return obj;
     }
}

Ответ 6

Один из вариантов помещает их в класс как нестатические элементы и помещает объект такого типа внутри вашей функции main(). Это упрощает создание не-globals , когда вы узнаете, что вам нужно, по какой бы причине.