IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Classe singleton template et reinterpret_cast rejeté par GCC


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Classe singleton template et reinterpret_cast rejeté par GCC
    Bonsoir,

    le code suivant est un emprunt au tuto de David Come sur les pattern objet en C++.

    Je voudrais créer une classe template Singleton,
    et je cherche à lui fournir un opérateur de comparaison qui prendrait des entiers.

    Je ne parviens pas à écrire son code template.

    le code de singleton_tpl.tpp avec le nécessaire opérateur == :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <stdio.h>
    #include <iostream>
    
    using namespace std ;
    
    template <class T> T Singleton<T>::m_i = T();
    
    template <class T> T& Singleton<T>::instance()
    {
    	if(m_i == 0) // premier check
    	{
    		// CODE to lock myself
    		lock() ;
    		if(m_i == 0) // second
    		{
    			m_i =                                               // phase 3 de la liste
    					static_cast<T*>(operator new(sizeof(T))) ;  // phase 1
    			new (m_i) T;                                        // phase 2
    			UUID = rand () ;
    			pthread_mutex_init (&mutex, NULL) ;
    		}
    
    		if (m_i != 0)  // l'objet est bien initialisé
    		{
    			unlock() ; // ici on déverrouille simplement
    		}              // un des threads,
        }
    
        return m_i; // ainsi il suffit d'appeler instance () plusieurs fois
    }               // pour être sûr de déverrouiller notre thread
    
    template <class T> void Singleton<T>::lock()
    {
    	pthread_mutex_lock (&mutex) ;
    }
    
    template <class T> void Singleton<T>::unlock()
    {
    	pthread_mutex_unlock (&mutex) ;
    }
    
    template <class T> bool Singleton<T>::operator==(int i) const
    {
    	if ( UUID == (reinterpret_cast<T>(i)).UUID )
    	{
    		return true ;
    	}
    	return false ;
    }

    Le compilateur (g++) me dit que mon reinterpret_cast est illégal.

    Est-ce que je fais fausse route ?

    Merci.

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 745
    Points : 3 660
    Points
    3 660
    Par défaut
    Je ne comprends pas ce que tu veux faire avec ton reinterpret_cast. Mais l'ensemble de ce code est inutile: une variable static pour instancier qu'une fois est thread-safe depuis C++11, le tout ne dépassant pas 2 lignes.

    À noter aussi que le singleton est plutôt considéré comme un code-smell et une variable globale déguisée.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Points : 15
    Points
    15
    Par défaut je ne connais pas C++11
    Citation Envoyé par jo_link_noir Voir le message
    (...) une variable static pour instancier qu'une fois est thread-safe depuis C++11, le tout ne dépassant pas 2 lignes.
    Je ne connais pas C++11.
    Je vais chercher à aborder C++11 ...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par laglumie Voir le message
    Je ne connais pas C++11.
    Je vais chercher à aborder C++11 ...
    Je crois que je comprends : l'implémentation "naïve" (non template) de David Come est en fait la bonne solution. Il suffit d'une variable statique mais nous allons équiper notre classe Singleton d'un mutex fourni par la librairie standard C sous Linux, de façon à bloquer notre constructeur lors d'accès concurrents.

    De ce fait, le code ne sera plus du "pur" C++, mais introduira des fonctions système Linux.
    Pour l'adapter à Microsoft il suffira de faire des #if et des #include dans le code C++ en appelant les solutions équivalentes.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 745
    Points : 3 660
    Points
    3 660
    Par défaut
    Comme je l'ai dit avant, l'initialisation d'une variable statique est déjà thread-safe, un mutex ne sert à rien !

    Au passage, les mutex font partie de la bibliothèque standard depuis C++11. Il serait temps de se mettre à jour, cela fait 10 ans que les compilateurs supportent cette norme et il y en a eu 3 autres depuis.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 049
    Points
    33 049
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par laglumie Voir le message
    Je crois que je comprends : l'implémentation "naïve" (non template) de David Come est en fait la bonne solution. Il suffit d'une variable statique mais nous allons équiper notre classe Singleton d'un mutex fourni par la librairie standard C sous Linux, de façon à bloquer notre constructeur lors d'accès concurrents.

    De ce fait, le code ne sera plus du "pur" C++, mais introduira des fonctions système Linux.
    Pour l'adapter à Microsoft il suffira de faire des #if et des #include dans le code C++ en appelant les solutions équivalentes.
    Ouais, pourquoi pas faire mal un truc simple après tout
    Sinon on a std::mutex.

    Mais ce pattern de singleton est dépassé et ne devrait jamais être utilisé.
    Un pattern singleton propre c'est un objet qu'on instancie 1 fois et quand on le décide. Pas un truc qui s'initialise tout seul et disparait jamais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/08/2014, 17h29
  2. [introspection][singleton] introspetion de classe à singleton
    Par Jaxofun dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 18/08/2005, 09h59
  3. fonctionnement de la classe Singleton
    Par lepoutho dans le forum C++
    Réponses: 11
    Dernier message: 04/08/2005, 09h28
  4. Réponses: 3
    Dernier message: 19/05/2005, 10h46
  5. [Template] methode template d'une classe pas template
    Par bigquick dans le forum Langage
    Réponses: 8
    Dernier message: 25/03/2005, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo