Куда необходимо поместить глобальные константы в программу C++?

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

15
задан Péter Török 18 April 2012 в 13:25
поделиться

6 ответов

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

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

13
ответ дан 1 December 2019 в 03:24
поделиться

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

0
ответ дан 1 December 2019 в 03:24
поделиться

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

5
ответ дан 1 December 2019 в 03:24
поделиться

Как простое практическое правило, я кладу их в любое место, в результате чего у них не будет раздражающих префиксов в стиле 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 не является «раздражающим» префиксом, это вполне разумный префикс, поскольку это описательный модификатор, а не притяжательный («максимальный радиус круга »). Так что может остаться.

1
ответ дан 1 December 2019 в 03:24
поделиться

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

class Constant
{
public:
     static const ComplexObject& getComplexObject()
     {
          static ComplexObject constObj = createComplexObject();
          return constObj;
     }
private:
     static ComplexObject createComplexObject()
     {
         ComplexObject obj;
         obj.setValue(1);
         return obj;
     }
}
1
ответ дан 1 December 2019 в 03:24
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: