Синглтон - зачем использовать классы?

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

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.

Ответы на вопрос(6)

Ваш ответ на вопрос