Синглтон - зачем использовать классы?
Буквально на днях я видел код, который использует так называемый шаблон синглтона. Имея в виду что-то вроде
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;
}
в файл реализации.
Я знаю, что это с семантической точки зрения синглтон, однако я вижу, что первый вариант используется в коде C ++ гораздо чаще, чем второй. Почему? Я считаю, что вторая версия немного лучше, поэтому я спрашиваю себя, упускаю ли я что-то очевидное.
Вторая версия проще в реализации и менее подвержена ошибкам. В первом варианте личный конструктор копирования отсутствует, чтобы продемонстрировать это. Во втором варианте нет способа сделать эту ошибку.Реализация и интерфейс лучше разделены во второй версии. В первом все частные члены должны быть объявлены в заголовке. Это имеет то преимущество, что вы можете переписать реализацию с нуля, и вам даже не нужно перекомпилировать что-либо, использующее синглтон. При использовании первого варианта очень вероятно, что вам придется перекомпилировать весь пользовательский код, даже если изменяются только незначительные детали реализации.Детали реализации скрыты в обоих случаях. В первом варианте используется private, а во втором - безымянные пространства имен.Не могли бы вы объяснить, почему все используют первый вариант? Я не вижу ни одного преимущества перед старым добрым способом ведения дел в C.