Singleton - Por que usar classes?

Outro dia vi o código que usa o chamado padrão singleton. Significado algo ao longo das linhas de

class MySingleton{
public:
    void foo() { ... }
    static MySingleton&get_instance(){
        static MySingleton singleton;
        return singleton
    }
private:
    MySingleton(){ ... }
    ~MySingleton(){ ... }
    int bar;
};

Eu vejo por que alguém iria querer fazer isso:

Torne a instância globalmente acessível.Certifique-se de que nunca haja mais de uma instância dessa classe.

No entanto, não vejo por que esse modo de fazer as coisas é superior a algumas funções livres. A maneira que eu implementaria é colocar

namespace some_name{
    void foo();
}

no cabeçalho e

namespace some_name{
    void foo(){
        ...
    }
}

no arquivo de implementação. Se eu precisar de inicialização e / ou limpeza, eu adiciono algumas funções que devem ser explicitamente chamadas ou eu adiciono

namespace{
    class Dummy{
        Dummy(){ ... }
        ~Dummy(){ ... }
    }dummy;
}

no arquivo de implementação.

Eu sei que isso é de um ponto de vista semântico um singleton, no entanto, vejo a primeira variante usada com mais freqüência no código C ++ do que o segundo. Por quê? Eu considero a segunda versão um pouco superior, então me pergunto se estou perdendo algo óbvio.

A segunda versão é mais simples de implementar e menos propensa a erros. Na primeira variante, o construtor de cópia privada está ausente de propósito para demonstrar isso. Na segunda variante, não há como fazer esse erro.Implementação e interface são melhor separadas na segunda versão. No primeiro, todos os membros privados devem ser declarados no cabeçalho. Isso tem a vantagem de poder reescrever a implementação do zero e nem mesmo precisar recompilar qualquer coisa que use o singleton. Ao usar a primeira variante, é muito provável que você tenha que recompilar todo o código do usuário, mesmo quando apenas alterar pequenos detalhes de implementação.Os detalhes da implementação estão ocultos nos dois casos. Na primeira variante usando private e na segunda variante usando namespaces sem nome.

Você pode me explicar por que todo mundo usa a primeira variante? Eu não vejo uma única vantagem sobre o bom e velho jeito de fazer as coisas em C.

questionAnswers(6)

yourAnswerToTheQuestion