2010-03-05 2 views

ответ

12

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

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

+0

+1, но для констант уровня модуля, которые не должны быть видимыми для объявления класса, я использую монономическое namspace. –

+0

@ T.E.D. Зависит от того, что ваш «модуль» - я думал о большей части, состоящей из нескольких классов. Если под «модулем» вы подразумеваете единую единицу компиляции, я полностью согласен с вами. –

4

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

0

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

1

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

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

Если пространство имен MyLib содержит константы circle_max_radius, sphere_max_radius, rectangle_max_width, rectangle_max_height, где круг, сфера и Прямоугольник классы, то они должны статические члены класса.

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

1

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

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

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

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

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

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

Смежные вопросы