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

C++ Discussion :

[Résolu]Singleton avec template de fonction


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 32
    Par défaut [Résolu]Singleton avec template de fonction
    Bonjour,

    Je souhaite réaliser une classe permettant de gérer le chargement des ressource sons et images avec sfml. Le chargement étant identique au type prêt (sf::Image ou sf::SoundBuffer) entre les deux, j'ai décidé de créer une classe template singleton qui charge et conserve les médias en mémoire. L'objectif est donc de pouvoir charger des médias de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MediaManager<sf::SoundBuffer>::getInstance()->getMedia("chemin vers le son");
    MediaManager<sf::Image>::getInstance()->getMedia("chemin vers l'image");
    Pour réaliser cette classe, je m'y suis pris de la manière suivante :

    MediaManager.hpp :
    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
     
    #include <SFML/Audio.hpp>
    #include <iostream>
    #include <map>
     
    template<class T> class MediaManager
    {
    public:
    	static MediaManager<T>* getInstance()
    	{
    		if (NULL == _singleton)
    		{
    			std::cout << "DEBUG: MediaManager | Creation du singleton." << std::endl;
    			_singleton = new MediaManager<T>;
    		}
    		return _singleton;
    	}
     
    private:
    	static MediaManager<T>* _singleton;			//Pointeur du singleton
     
    	MediaManager();
     
    };
     
     
    template<class T> MediaManager<T>* MediaManager<T>::_singleton = NULL;
    Avec simplement la création de la classe sous forme de singleton, je me retrouve avec une erreur de link sur getinstance() :

    Erreur 2 error LNK2019: symbole externe non résolu "private: __thiscall MediaManager<class sf::SoundBuffer>::MediaManager<class sf::SoundBuffer>(void)" (??0?$MediaManager@VSoundBuffer@sf@@@@AAE@XZ) référencé dans la fonction "public: static class MediaManager<class sf::SoundBuffer> * __cdecl MediaManager<class sf::SoundBuffer>::getInstance(void)" (?getInstance@?$MediaManager@VSoundBuffer@sf@@@@SAPAV1@XZ)
    Je ne vois pas ce que je fais de mal ici, une idée pour me guider ?

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Je pense que tu n'as pas implémenté le constructeur par défaut (on ne voit que la signature dans l'exemple) ou que tu l'as implémenté dans un .cpp, vu que c'est une classe template tout doit être dans le .hpp.

    Aussi, si tu utilises plusieurs threads, sache que ton code n'est pas thread-safe, si tu utilises C++11, je te conseille de faire simplement ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static MediaManager<T>& getInstance()
    {
      static MediaManager<T> manager;
      return manager;
    }
    Et même si tu n'utilises pas plusieurs threads, ce code est quand même plus clair, je ne vois pas l'avantage de passer par un pointeur...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 32
    Par défaut
    En effet, je me suis concentré sur les templates alors que l'erreur était toute bête, c'était bien le constructeur.
    Je ne connaissais pas cette implémentation pour les singletons et je vais l'utiliser même si je n'ai pas besoin de thread, c'est en effet beaucoup plus clair et léger comme ça.

    Merci beaucoup !

Discussions similaires

  1. Surchargé une fonction template avec template
    Par SKone dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2014, 20h00
  2. [Résolu] Probleme avec la fonction count
    Par GanJahLove dans le forum Général Python
    Réponses: 7
    Dernier message: 05/11/2013, 19h49
  3. Réponses: 32
    Dernier message: 28/11/2010, 17h33
  4. Pointeur de fonction avec template
    Par ehmicky dans le forum Langage
    Réponses: 5
    Dernier message: 23/11/2010, 02h07
  5. Réponses: 1
    Dernier message: 12/01/2009, 16h45

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