На днях я видел код, который использует так называемый шаблон singleton. Значит что-то вдоль линий
class MySingleton{
public:
void foo() { ... }
static MySingleton&get_instance(){
static MySingleton singleton;
return singleton
}
private:
MySingleton(){ ... }
~MySingleton(){ ... }
int bar;
};
Я понимаю, почему нужно было бы это сделать:
- Сделать экземпляр глобально доступным.
- Убедитесь, что в этом классе не более одного экземпляра.
Однако я не понимаю, почему этот способ делать вещи превосходит пару бесплатных функций. То, как я его реализую, - это поставить
namespace some_name{
void foo();
}
в заголовке и
namespace some_name{
void foo(){
...
}
}
в файле реализации. Если мне нужна инициализация и/или очистка, я либо добавляю пару функций, которые должны быть явно вызваны, либо добавляю
namespace{
class Dummy{
Dummy(){ ... }
~Dummy(){ ... }
}dummy;
}
в файл реализации.
Я знаю, что это с семантической точки зрения синглтон, однако я вижу, что первый вариант используется гораздо чаще в коде С++, чем второй. Зачем? Я считаю, что вторая версия немного выше, поэтому я спрашиваю себя, не хватает ли я чего-то очевидного.
- Вторая версия проще реализовать и меньше подвержена ошибкам. В первом варианте конструктор частной копии отсутствует для демонстрации этого. Во втором варианте нет возможности сделать эту ошибку.
- Реализация и интерфейс лучше разделены во второй версии. В первом случае все закрытые члены должны быть объявлены в заголовке. Это имеет то преимущество, что вы можете переписать реализацию с нуля и даже не нужно перекомпилировать все, что использует singleton. При использовании первого варианта очень вероятно, что вам придется перекомпилировать весь код пользователя, даже если только меняются незначительные детали реализации.
- Детали реализации скрыты в обоих случаях. В первом варианте используется закрытый и во втором вариантах с использованием неназванных пространств имен.
Не могли бы вы объяснить мне, почему каждый использует первый вариант? Я не вижу единственного преимущества над старым добрым способом делать вещи на C.