Singleton

Contenu du snippet

Ce code implémente, a travers d une classe template, un classe de singleton, qui permet de n utiliser qu une seule instance d une classe particulière.
Le code est largement réutilisable, et peut s avérer utile dans certains cas, c est pourquoi je le mets a disposition

Source / Exemple :


#include <stdio.h>

#define DEBUG	// affiche les informations de debuggage

template <typename T> 
class singleton 
{ 
protected: 
    // Constructeur/Destructeur 
    singleton( ) { } 
	// Supprime l instance de la classe si elle a été crée
    ~singleton( ) 
	{
		if( m_pInstance != NULL ) 
        { 
            delete m_pInstance; 
            m_pInstance = 0; 
        } 
	} 

public: 
    // renvoie une instance de la classe, la crée si elle n existe pas
    static T *GetInstance( void ) 
    { 
        if( m_pInstance == NULL ) 
		{
			m_pInstance = new T; 
#ifdef DEBUG
			printf ("Creation de objet\n");
#endif
		}
		else
		{
#ifdef DEBUG 
			printf ("Objet deja cree\n");
#endif
		}
		
        return ((T *)m_pInstance); 
    } 

private: 
    static T    *m_pInstance;	// instance unique de la classe

}; 

template <typename T> T *singleton<T>::m_pInstance = NULL;

// on derive la classe pour obtenir ses methodes
class CTest : public singleton<CTest> 
{ 
    friend class singleton<CTest>; // necessaire pour acceder aux variables privees

public: 
    // fonctions publiques 
    void    Set( int _a ) { a = _a; } 
    int     Get( ) { return a; } 

private: 
    // variable membre 
    int     a; 

};

// Fonction principale
int main( int argc, char *argv[] ) 
{ 
    CTest *a, *b;	// inconvénient :: on doit utiliser des pointeurs

	// recupere une instance de la classe, peu importe si elle a été créée ou pas
	a = CTest :: GetInstance ();
	b = CTest :: GetInstance ();

    a->Set( 3 ); 

    // affichage des valeurs
    printf( "a->a = %d\n", a->Get( ));
    printf( "b->a = %d\n", b->Get( ));
    return 0; 
}

Conclusion :


Ben voila, le code marche plutot bien, j espere l avoir assez commenté, n hésitez pas a posez les questions qui vous traversent l esprit a propos de cette source, je me fereais une joie d y répondre ;)
A+

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.