Разница между extern const внутри пространства имен и статическим членом класса const?

Желательно, чтобы константы (например, определенные строки или числа) определялись в какой-то центральной точке. Чтобы сохранить читабельность кода, также желательно иметь легкий доступ к этим константам. Во время моего исследования передового опыта для достижения этой цели я нашел следующие два решения (https://stackoverflow.com/a/9649425/2776093).

FoodConstants.h:

namespace FoodConstants {
    namespace Fruits {
        extern const string Apple;
        ...
    }
    ...
}

FoodConstants.cpp:

namespace FoodConstants {
    namespace Fruits {
        const string Apple = "apple" ;
        ...
    }
    ...
}

FoodConstants2.h:

class FoodConstants {
public:
    class Fruits {
    public:
        static const string Apple;
        ...
    }
    ...
}

FoodConstants2.cpp:

const string FoodConstants::Fruits::Apple = "apple"
...

Для обоих решений я могу получить доступ к константе apple с помощью FoodConstants::Fruits::Apple в любом месте программы, где включен .h. Инициализация выполняется в той же единице компиляции, что позволяет избежать проблем с инициализацией. Я заметил одно отличие: для второго решения я не могу, например, выполнить «использование пространства имен FoodConstants», чтобы сократить доступ к строковой константе с помощью Fruits::Apple.

Есть ли другие отличия? Есть ли предпочтительный способ организации таких констант?


person mxenic    schedule 13.09.2013    source источник
comment
Еще одно отличие состоит в том, что если Fruits является классом, вы можете передать его в качестве аргумента шаблона типа, чего нельзя сделать для пространств имен.   -  person Angew is no longer proud of SO    schedule 13.09.2013
comment
Если вы просто собираетесь иметь класс, содержащий другие классы, сделайте его пространством имен. То же самое, если у вас будет класс только с общедоступными переменными. Классы в основном предназначены для создания объектов с полным состоянием. Кроме того, классы могут использоваться как типы, чего не может быть пространство имен.   -  person Some programmer dude    schedule 13.09.2013
comment
Желательно, чтобы константы определялись в какой-то центральной точке. Не согласен с предпосылкой.   -  person David Rodríguez - dribeas    schedule 13.09.2013
comment
Желательно, чтобы константы, которые принадлежат друг другу (например, константы для фруктов), были сгруппированы вместе в какой-то момент. Это то, что я на самом деле имел в виду. Нежелательно иметь все константы в какой-то центральной точке. Согласны сейчас?   -  person mxenic    schedule 13.09.2013


Ответы (1)


Есть ли другие отличия?

Да это так. Я вижу два:

  1. Используя решение класса, вы можете контролировать доступность (public/protected/private), что невозможно с решением пространства имен.

  2. Используя пространство имен, вы можете разделить объявления на несколько файлов, в то время как это невозможно с решением класса, поскольку определение класса (которое содержит объявления всех членов) должно быть дано в одном файле.

person Cassio Neri    schedule 13.09.2013