Где вы должны поместить глобальные константы в программе C ++? - PullRequest
15 голосов
/ 05 марта 2010

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

Ответы [ 6 ]

13 голосов
/ 05 марта 2010

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

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

5 голосов
/ 05 марта 2010

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

2 голосов
/ 05 марта 2010

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

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

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

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

1 голос
/ 05 марта 2010

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

1 голос
/ 05 марта 2010

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

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

0 голосов
/ 05 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...