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 033
    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 033
    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