Где вы должны помещать глобальные константы в программу на С++?
Где бы вы поместили глобальные константы в приложение С++? Например, вы бы поместили их в класс? В структуре?
Ответы
Ответ 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 , когда вы узнаете, что вам нужно, по какой бы причине.