begin process at 2012 05 27 19:20:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > SINGLETON

SINGLETON


 Information sur la source

 Description

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

  • #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;
  • }
#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+


 Sources du même auteur

Source avec Zip CONVERTISSEUR D'IMAGES
EQUIVALENT A DATE () DU PHP
Source avec Zip BASECODE SDL/OPENGL
Source avec Zip LIBRAIRIE SON [FMOD]
Source avec Zip CONSOLE A LA QUAKE (DANS LA CONSOLE DOS!)

 Sources de la même categorie

LISTER FICHIERS ET RÉPERTOIRES (MULTIPLATEFORME) par christophedlr
UTILISATION DES TYPELIST EN C++ par wyden
Source avec Zip Source avec une capture QCSSCOMPRESSOR par alphaone
AFFICHAGE D'UN TRIANGLE ISOCELE par nabche
Source avec Zip GESTION D'UNE BIBLOTHEQUE par leclerro19

Commentaires et avis

Commentaire de Hylvenir le 08/03/2004 11:11:14

Salut,
quelques remarques...
Ta classe ressemble plus à un conteneur
de singleton qu'à un singleton (cf Modern C++ Design)
Si tu ajoutes   { CTest c = *a; }
après  b = CTest :: GetInstance ();
ton programme ne devrait pas fonctionner (core)
Voici une version sans pointeur :

// ----- SingletonHolder
template&lt; typename T &gt;
class SingletonHolder
{
  protected:
    SingletonHolder();
    SingletonHolder( const SingletonHolder& );
    ~SingletonHolder() { delete instance_; }
    SingletonHolder& operator == ( const SingletonHolder& );
    
    static T* instance_;

  public:
    static T& Instance();
};

template&lt; typename T &gt;
T& SingletonHolder&lt;T&gt;::Instance()
{
  if ( !instance_ )
    instance_ = new T;

  return *instance_;
}

template&lt; typename T &gt;
T* SingletonHolder&lt;T&gt;::instance_ = 0;


// Fonction principale
int main( int argc, char *argv[] )
{
    CTest& a = SingletonHolder&lt; CTest &gt;::Instance(),
         & b = SingletonHolder&lt; CTest &gt;::Instance();

  ... idem pour la suite
}

C'est du rapidement fait, ton y'a peut être d'autres bugs.

Commentaire de BlackGoddess le 08/03/2004 12:09:41

juste pour info :

#include &lt;stdio.h&gt; est un header C
#include &lt;iostream&gt; est l'equivalent C+
printf est du C, cout est du C++

on ne peut pas utiliser ca pour un singleton ? :

class singleton
{
...
};

class utilise_singleton
{
  static singleton s;
  ...
};

static utilise_singleton::singleton s;

Commentaire de Kirua le 08/03/2004 16:35:06

BlackGoddess, je suis pas tt à fait sûr que ton option fonctionne dans le cas où tu voudrais utiliser proprement le singleton dans des classes sensées être réutilisables, si? je sais pas trop, mais ça me paraît trop simple (c'est pas un critère évidemment...)

Commentaire de Hylvenir le 08/03/2004 20:46:03

BlackGoddess:
class Singleton
{ public: static Singleton& Instance(); };
// Il faut mettre les constructeurs en privé ici

Singleton& Singleton::Instance() {
static Singleton s;
return s;
}
Il faut utiliser de préférence une méthode statique de classe, cela
permet d'éviter des problèmes sur l'ordre de création des singletions.
Cette version doit marcher dans les cas simples.
(C'est la version de Scott Meyers sauf erreur de ma part)
La version postée utilise les templates qui est une forme un peu plus avancée
pour les singletons qui permettrait de gérer par les références mortes,
le multi-thread par exemple.

Commentaire de Cyberboy2054 le 10/03/2004 16:22:44

Lut
Par rapport a la remarque concernant iostream et stdio, c est une question de gout, personnellement ca ne me dérange absolument pas de faire des printf dans quelque chose fait en c++ (et qui ne peut, comme ici, pas etre porté vers du c (du moins je ne crois pas))
La remarque concernant le renvoie d une variable statique au l ieu d utiliser une methode statique me semble meilleure, je vais garder celle la. Néanmoins cette version portera probleme lors de l utilisation du multi threading (pas dans mon cas, car je ne m en sers pas), je ne sais pas si les methodes statiques sont sources de problemes si elles sont utilisées en multithreading
Et juste une question relative aux templates : qu elle est la difference entre
template &lt; class T &gt; class truc {....}; et
template &lt; typename T &gt; class truc {....}; ?
Car bien que je me serve des template depuis un moment, je n ai pas vraiment saisi la différence ....
A+

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales