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

Bibliothèques C++ Discussion :

[probleme] template singleton et .lib static


Sujet :

Bibliothèques C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut [probleme] template singleton et .lib static
    Bonjour,

    J'ai un probleme de context entre mon binaire et une lib statique _Et dynamique_ que j'ai fait.
    Je voulais savoir si quelqu'un a une solution.

    J'ai un template Singleton basique du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    template <typename T>
    class Singleton
    {
    public:
    static T& get(void);
    static void destroy(void);
     
    protected:
    Singleton(void);
    virtual ~Singleton(void);
     
    protected:
    static T *s_pInstance;
    };
    cela marche tres bien, mais le probleme intervient quand une class de ma lib static derive de ce template en lui donnant son propre type.
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Foo : public Singleton<Foo>
    {
    friend class Singleton<Foo>;
    };
    Je crois que le compilo me cree deux classes (une pour mon binaire et une pour ma lib _statique_ dynamique) a la compil pour un meme type T.
    (logique vu que le template est dans le .h, utilise par la lib et le binaire a la compil)

    du coup, lorsque je fais un Foo::Get(), selon que je sois dans du code implemente dans mon binaire ou dans ma lib (dynamique), ce n'est en realite pas la meme classe qui est appele, du coup les s_pInstance sont logiquement different, et mon Singleton n'en est plus un ! et ca fou mechament le bordel.


    Si je n'ai plus de template, mais que je me paluche le Get Destroy static directement dans ma classe Foo, alors la pas de soucis, il n'y a bien qu'une classe et donc qu'une instance, mais j'ai besoin de ce template.

    --> en fait non, ca ne marche pas non plus.

    merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Je suis pas certains d'avoir compris ton problème, mais concernant les bibliothèques statiques, elles sont intégrées à chacun des binaires compiler.

    C'est-à-dire, si dans ton projet tu as une bibliothèque dynamique et un exécutable, et que les deux utilisent ta bibliothèque statique, alors cette dernière sera intégrée dans chacun des binaires. Donc si ta bibliothèque statique possède des variables statiques, alors tu auras deux fois les variables statiques...

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Pareil. Je ne suis pas sûr de comprendre ton problème. D'autant qu'une classe générique ne produit du code que lorsqu'elle est instanciée. Peux-tu préciser la structure de ton projet ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Effectivement, je me suis bien emmelé dans mon explication, et j'ai melangé ma lib static et dynamique.

    le probleme ne viens d'ailleurs surment pas du fait du template, mais plustot de l'instance membre statique.


    mon binaire link bien vers une lib static qui contient le singleton, et la pas de soucis lors de son utilisation. Il link aussi vers une lib dynamic qui elle meme link aussi vers la lib static.

    Donc lorsque j'utilise Foo dans l'implementation de DynLib, il est different de celui instancié dans le binaire, du au fait comme vous le dite plus haut, qu' a la compil du binaire et de DynLib deux instances différentes sont crée.

    voila le petit exemple complet, avec le binaire, la lib statique et dynamique.
    Quelles solution(s) peut on trouver a ce genre de pb, sachant que j'aimerai conserver ma lib statique. N'y a t il pas moyen de faire en sorte que le singleton dans mes lib dynamique recupere l'instance de mon singleton instancié dans le binaire ?

    Code : 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
     
    /////////////////////////////////////////////////////////
    //////////////////////// BINAIRE ////////////////////////
     
    /**************** main.cpp ****************/
     
    #include "BinBar.h"
    #include "LibBar.h"
    #include "DynBar.h"
    #include "LibFoo.h"
     
    int main(int ac, char **av)
    {
    	BinBar a;
    	LibBar b;
    	DynBar c;
     
    	Foo::Get().Initialize();
     
    	a.Test(); // -> affiche 42, pas de soucis
    	b.Test(); // -> affiche 42, pas de soucis
    	c.Test(); // -> affiche -1, ce n'est effectivement pas le meme singleton, ce qui m'embete.
     
    	return 0;
    }
     
     
    /**************** BinBar.h ****************/
     
    class BinBar
    {
    public:
    	void Test(void);
    };
     
    /**************** BinBar.cpp ****************/
     
    #include "BinBar.h"
    #include "LibFoo.h"
     
    void BinBar::Test(void)
    {
    	Foo::Get().PrintValue();
    }
     
     
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////

    Code : 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    /////////////////////////////////////////////////////////
    ////////////////////// STATIC_LIB ///////////////////////
     
    /**************** Singleton.h ****************/
     
    #ifndef _LIB_SINGLETON_H_
    #define _LIB_SINGLETON_H_
     
    template <class T>
    class Singleton
    {
    public:
    	inline static T& Get(void)
    	{
    		if (!s_pInstance)
    			s_pInstance = new T();
     
    		return *s_pInstance;
    	};
     
    	inline static void Destroy(void)
    	{
    		delete s_pInstance;
    		s_pInstance = 0;
    	};
     
    protected:
    	Singleton(void){};
    	virtual ~Singleton(void){};
     
    protected:
    	static T *s_pInstance;
    };
     
    template <class T> T* Singleton<T>::s_pInstance = 0;
     
    #endif
     
     
     
    /**************** LibFoo.h ****************/
     
    #include "LibSingleton.h"
     
    class Foo : public Singleton<Foo>
    {
    	friend class Singleton<Foo>;
     
    public:
    	void Initialize(void);
    	void PrintValue(void);
     
    protected:
    	Foo(void);
    	virtual ~Foo(void);
     
    protected:
    	int m_iValue;
    };
     
    /**************** LibFoo.cpp ****************/
     
    #include "LibFoo.h"
    #include <iostream>
     
    Foo::Foo(void) : Singleton<Foo>()
    , m_iValue(-1)
    {
     
    }
     
    Foo::~Foo(void)
    {
     
    }
     
    void Foo::PrintValue(void)
    {
    	std::cout << "Value is : " << m_iValue << std::endl;
    }
     
    void Foo::Initialize(void)
    {
    	m_iValue = 42;
    }
     
    /**************** LibBar.h ****************/
     
    class LibBar
    {
    public:
    	void Test(void);
    };
     
    /**************** LibBar.cpp ****************/
     
    #include "LibBar.h"
    #include "LibFoo.h"
     
    void LibBar::Test(void)
    {
    	Foo::Get().PrintValue();
    }
     
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////

    Code : 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
     
    /////////////////////////////////////////////////////////
    //////////////////////// DYN_LIB ////////////////////////
     
    /**************** DynExport.h ****************/
     
    #ifndef _DYN_EXPORT_
    #define _DYN_EXPORT_
     
    #ifdef DYNAMICLIB_EXPORTS
    #define DYN_API __declspec(dllexport)
    #else
    #define DYN_API __declspec(dllimport)
    #endif
     
    #endif
     
    /**************** DynBar.h ****************/
     
    #include "DynExport.h"
     
    class DYN_API DynBar
    {
    public:
    	void Test(void);
    };
     
    /**************** DynBar.cpp ****************/
     
    #include "DynBar.h"
    #include "LibFoo.h"
     
    void DynBar::Test(void)
    {
    	Foo::Get().PrintValue();
    }
     
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Citation Envoyé par typedef Voir le message
    Quelles solution(s) peut on trouver a ce genre de pb, sachant que j'aimerai conserver ma lib statique. N'y a t il pas moyen de faire en sorte que le singleton dans mes lib dynamique recupere l'instance de mon singleton instancié dans le binaire ?
    Je crains, que tu ne sois obligé de passer ta lib statique en dynamique...
    Sinon, il faut que tu fasses une sur-couche de ta classe dans une des lib dynamiques et que tu n'utilises dans tout ton projet que la surcouche...

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Fabllot Voir le message
    Je crains, que tu ne sois obligé de passer ta lib statique en dynamique...
    Sinon, il faut que tu fasses une sur-couche de ta classe dans une des lib dynamiques et que tu n'utilises dans tout ton projet que la surcouche...
    J'aurais tendance à dire la même chose.

Discussions similaires

  1. Template Singleton problem
    Par grigoux dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2009, 23h46
  2. probleme template hash_map
    Par rolphbrua dans le forum Langage
    Réponses: 1
    Dernier message: 08/08/2006, 23h18
  3. probleme template qcm en loadmovie
    Par serna dans le forum Flash
    Réponses: 3
    Dernier message: 05/06/2006, 22h59
  4. Probleme Template
    Par Muetdhiver dans le forum Langage
    Réponses: 11
    Dernier message: 18/04/2006, 11h00
  5. probleme template me renvoi qq chose en trop
    Par Triangle dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/07/2005, 15h01

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