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 :

Singleton & Smart_pointer


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut Singleton & Smart_pointer
    Bonjour,

    Le tuto n'offre pas de solutions pour réaliser des singletons en passant par des smart pointer.
    Comment peut-on s'y prendre?

    Actuellement mes tests donne:

    .h
    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
     
    class Ressources_Manager : boost::noncopyable{
    public:
    	static boost::shared_ptr<Ressources_Manager> Instance();
    	virtual ~Ressources_Manager();
     
     
    private:
    //	boost::shared_ptr<Ressources_Manager> operator= (const boost::shared_ptr<Ressources_Manager>){}
    	Ressources_Manager();
    	Ressources_Manager (const Ressources_Manager&);
     
    	static boost::weak_ptr<Ressources_Manager>  m_instance;
     
    	sf::Texture H_Sp_Prairie;
    	sf::Image   Img_H_Prairie;
     
    	void Load_Textures();
    	void Load_Images();
    };


    .cpp
    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
     
    	boost::shared_ptr<Ressources_Manager> Ressources_Manager_ptr = Ressources_Manager::Instance();
    //	Ressources_Manager Ressources_Manager::m_instance=Ressources_Manager();
     
    		Ressources_Manager::Ressources_Manager() {
     
    			Load_Images();
    			Load_Textures();
    		}
     
    		Ressources_Manager::~Ressources_Manager() {
     
    		}
     
    		boost::shared_ptr<Ressources_Manager> Ressources_Manager::Instance()
    		{
     
    			  boost::shared_ptr<Ressources_Manager> instance = m_instance.lock();
    			  if (!instance) {
    			    instance.reset(new Ressources_Manager());
    			    m_instance = instance;
    			  }
    			return instance;
    		}
     
    		void Ressources_Manager::Load_Images()
    		{
    			Img_H_Prairie.loadFromFile("Image/HexaTestSize.bmp");
    			Img_H_Prairie.createMaskFromColor(sf::Color(255,255,255));
    		}
     
    		void Ressources_Manager::Load_Textures()
    		{
    			H_Sp_Prairie.loadFromImage(Img_H_Prairie);
    		}

    Erreur affichée:
    ../RessourcesManager.cpp:29: undefined reference to `itpro::ress::Ressources_Manager::m_instance'

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 034
    Billets dans le blog
    12
    Par défaut
    Bon, pour commencer, ton instance ne devrait pas être stockée dans un weak_ptr, car une fois sorti de ta fonction Instance(), le shared_ptr est détruit, et comme il est la seule strong reference sur l'instance, celle-ci est détruite.
    Ensuite, utilise boost::make_shared plutôt que ptr.reset( new... ).
    Pour ton erreur de link, c'est simplement dù au fait que tu déclarais m_instance en tant que weak_ptr et tu l'implémentais en tant que shared_ptr


    EDIT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	boost::shared_ptr<Ressources_Manager> Ressources_Manager_ptr = Ressources_Manager::Instance();
    //	Ressources_Manager Ressources_Manager::m_instance=Ressources_Manager();
    Que cherches-tu à faire là? Pourquoi m_instance a-t-elle changé de nom?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne suis pas certain que singleton et shared pointers aillent bien ensemble (sans compter que le singleton st souvent un anti-pattern) : Tu va avoir un singleton qui va être détruit dès que personne ne l'utilise, et se reconstruire à chaque utilisation. Difficile dans ces cas là de garder de l'état d'une utilisation à l'autre, et sans état à garder et à partager, à quoi sert un singleton ?

    Pour ton problème de link, j'imagine que c'est parce que tu as déclaré ta variable statique dans ton .h, mais que tu ne l'as définie nulle part. Ajoute dans ton .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::weak_ptr<Ressources_Manager>  Ressources_Manager::m_instance;
    http://cpp.developpez.com/faq/cpp/?p...tion-des-liens

    Sinon, ta fonction Instance n'est pas thread-safe : Qu'arrive-t-il si, alors que ton weak_ptr est vide, deux personnens demandent simultanément accès à Instance ? Tu risques de créer deux shared_ptr différents...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Bonjour,

    Merci pour vos réponses,
    En faite je n'ai pas besoins d'utiliser des threads pour cette class, mais je souhaite en faire un singleton pour ne l'initialisée q'une seule fois et pouvoir l’instancier un peut partout dans mon projet comme s'il s'agissait d'une variable globale.
    Je me suis un peut aventuré avec les weak_ptr sans savoir ou j'allais en suivant un code trouvé sur internet.
    En revanche je souhaiterais vraiment faire appel aux smart_ptr soit les shared_ptr pour partager cette classe avec les autres ressources de mon programme.
    Je n'ai pas encore trouvé la solution.

    Merci à vous

  5. #5
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Pb résolue,

    Merci à vous

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Hyssgrif Voir le message
    Bonjour,

    Merci pour vos réponses,
    En faite je n'ai pas besoins d'utiliser des threads pour cette class, mais je souhaite en faire un singleton pour ne l'initialisée q'une seule fois et pouvoir l’instancier un peut partout dans mon projet comme s'il s'agissait d'une variable globale.
    Je me suis un peut aventuré avec les weak_ptr sans savoir ou j'allais en suivant un code trouvé sur internet.
    En revanche je souhaiterais vraiment faire appel aux smart_ptr soit les shared_ptr pour partager cette classe avec les autres ressources de mon programme.
    Je n'ai pas encore trouvé la solution.

    Merci à vous
    Je me permet de revenir sur cette discussion, mais, à lire ton intervention, j'ai envie de te poser une seule question:

    Pourquoi voudrais tu pouvoir utiliser une variable comme si elle était globale (que ce soit sous la forme d'un singleton ou non)

    Car, d'expérience:
    1. aucune variable ne doit effectivement être accessible depuis partout dans le code
    2. le simple fait de permettre à "n'importe quelle fonction" d'aller chipoter à une variable rend le code particulièrement difficile à débuger

    Le plus simple, si tu veux t'assurer qu'une variable ne sera créée qu'une fois, c'est encore de faire en sorte d'avoir cette garantie par la construction de ton code (en veillant à ce qu'il n'y ai qu'une seule déclaration de la variable du type indiqué) et de veiller à la transmettre sous la forme d'une référence (éventuellement constante) à "tout ce qui pourrait en avoir besoin"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Salut Koala01,

    En réalité, l'objectif finale et de créer une classe dans une bibliothèque qui aurait pour rôle de charger une fois et une seule des ressources au début du programme, les stocker et les rendre disponibles un peut partout dans le code.
    Ici je charge des images, textures et autres..
    Je veux que ces ressources soient accessibles par certaine parties du programme sans avoir a recréer la classe et donc recharger ces ressources

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

Discussions similaires

  1. [Débutant] pattern singleton
    Par SirDarken dans le forum Débuter avec Java
    Réponses: 22
    Dernier message: 11/12/2004, 01h55
  2. Mutiple row in singleton select ????? [Important, merci]
    Par SkyDev dans le forum Bases de données
    Réponses: 6
    Dernier message: 20/04/2004, 14h02
  3. [debutant]Singleton
    Par bafman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/01/2004, 15h41

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