Куда Вы поместили бы глобальные константы в приложение C++? Например, Вы поместили бы их в класс? В структуре?
Я бы использовал пространство имен для глобальных констант, которые не очень сильно связаны с одним классом. В последнем случае я бы поместил их в этот класс.
Действительно глобальные константы (на уровне приложения) должны находиться в пространстве имен приложения (при условии, что ваше приложение находится в своем собственном пространстве имен, как и должно быть). Для констант уровня модуля естественным местом является собственное пространство имен модуля.
Один из вариантов - поместить их в класс как нестатические члены и поместить объект этого типа в вашу функцию main (). Это упрощает превращение их в неглобальные , когда вы обнаруживаете, что вам это нужно по какой-либо причине.
Лучший подход - поместить их в то же пространство имен, в котором они находятся. Большое приложение на C++ обычно имеет много модулей, каждый из которых имеет свой собственный набор констант. Каждый модуль должен находиться в своем пространстве имен, и его константы также должны находиться в нем.
Как простое практическое правило, я кладу их в любое место, в результате чего у них не будет раздражающих префиксов в стиле C.
Так, например, если ваши константы называются mylib_foo
, mylib_bar
, то они должны находиться в пространстве имен mylib и иметь вид mylib :: foo
и mylib :: bar
.
Если пространство имен mylib содержит константы circle_max_radius
, Sphere_max_radius
, rectangle_max_width
, rectangle_max_height
, где Circle, Sphere, классы), где Circle, Sphere они должны статические члены класса.
max
не является «раздражающим» префиксом, это вполне разумный префикс, поскольку это описательный модификатор, а не притяжательный («максимальный радиус круга »). Так что может остаться.
Один из возможных способов - использовать класс со статическими функциями-членами, которые возвращают константы. Я использую это, когда мне нужны константы, которые представляют собой нечто большее, чем базовые типы или простые объекты.
class Constant
{
public:
static const ComplexObject& getComplexObject()
{
static ComplexObject constObj = createComplexObject();
return constObj;
}
private:
static ComplexObject createComplexObject()
{
ComplexObject obj;
obj.setValue(1);
return obj;
}
}
Для констант, локальных для одного файла .cpp, лучший подход - объявить их в анонимном пространстве имен следующим образом:
namespace {
int const seconds_per_minute = 60;
int const minutes_per_hour = 60;
}
Для констант, которым необходимо быть видимыми для всей программы, самое простое решение - создать для них (именованное) пространство имен и поместить его в файл заголовка.
Если есть (или могут быть) какие-то операции, связанные с ними, вам, вероятно, следует создать для них одноэлементный класс . Например, довольно часто мои программы имеют одноэлементный класс с именем «конфигурация», который считывает константы запуска (такие как IP-адреса и вещи, которые я не хочу жестко кодировать) из файла конфигурации или реестра или чего-то еще как это.