Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1659 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Pointeur intelligent et singleton [résolu]

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pointeur intelligent et singleton [résolu]

n°2245999
bqron
We become what we think about.
Posté le 13-12-2014 à 20:56:21  profilanswer
 

Salut, j'essai de transposer ce code en utilisant des pointeur intelligent et je sèche...
 
L'original :

Code :
  1. TextureManager* TextureManager::s_pInstance = NULL; // déclarer en static dans le header
  2. TextureManager* TextureManager::Instance()              // idem
  3. {
  4.     if (s_pInstance == NULL)
  5.     {
  6.         s_pInstance = new TextureManager();
  7.         return s_pInstance;
  8.     }
  9.     return s_pInstance;
  10. }


 
Ma sauce :

Code :
  1. //---------------- TextureManager.h ----------------  
  2. class TextureManager
  3. {
  4. private:
  5.         std::map<std::string, SDL_Texture*>  m_textureMap;
  6.         //static TextureManager*     s_pInstance;  ////
  7.         static std::unique_ptr<TextureManager>  s_pInstance;
  8.         TextureManager();
  9. public:
  10.         //static TextureManager*  Instance();      // singleton
  11.         static std::unique_ptr<TextureManager> Instance();
  12.         ~TextureManager();
  13. };
  14. //---------------- TextureManager.cpp ----------------  
  15. std::unique_ptr<TextureManager> TextureManager::s_pInstance = nullptr; // toujours en static dans le header
  16. std::unique_ptr<TextureManager> TextureManager::Instance()  // idem
  17. {
  18.     if (s_pInstance == nullptr)
  19.     {
  20.         std::unique_ptr<TextureManager> s_pInstance(new TextureManager());
  21.         return s_pInstance;
  22.     }
  23.     return std::move(TextureManager::s_pInstance);
  24. }


 
Le singleton ne fonctionne plus, s_pInstance reçoit une nouveau pointeur a chaque appelle de "Instance()"


Message édité par bqron le 14-12-2014 à 07:17:58
mood
Publicité
Posté le 13-12-2014 à 20:56:21  profilanswer
 

n°2246001
Farian
Posté le 13-12-2014 à 21:07:31  profilanswer
 

Bonsoir !
 
Dans la fonction "instance", vous créez une variable locale "s_pInstance", qui masque le membre statique, et c'est à cette variable que vous donnez une valeur, pas au membre, qui vaut donc toujours "nullptr", puisqu'aucune valeur ne lui a été affectée ...
 
Enlevez le "std::unique_ptr<TextureManager>" et faites une affectation (je n'ai plus la syntaxe du std::unique_ptr en tête, je ne sais pas si il faut faire un "=" ou un "set" pour lui affecter une valeur).
 
Bonne continuation !

n°2246023
bqron
We become what we think about.
Posté le 14-12-2014 à 07:16:58  profilanswer
 

Merci de m'avoir mit sur la bonne voie, le problème est résolu :  

Code :
  1. std::shared_ptr<TextureManager> TextureManager::s_pInstance = nullptr;
  2. std::shared_ptr<TextureManager> TextureManager::Instance()
  3. {
  4.     if (s_pInstance == nullptr)
  5.     {
  6.         s_pInstance = std::make_shared<TextureManager>(TextureManager());
  7.         return s_pInstance;
  8.     }
  9.     return s_pInstance;
  10. }


 
Une question tout de même à propos du code original si possible, j'ai remarqué que le destructeur n’étais jamais appeler du coup le pointeur renvoyé par  "new TextureManager();" n’étais jamais libéré (a mon avis), même si j'utilisais le code ci-dessous, quelqu'un aurait-il une explication ?

Code :
  1. TextureManager::~TextureManager()
  2. {
  3.     if (s_pInstance != NULL)
  4.         delete s_pInstance;
  5. }

n°2246089
Farian
Posté le 15-12-2014 à 08:03:19  profilanswer
 

Dans l'ancienne version, l'attribut "s_pInstance" restait toujours à NULL, vu que c'était une variable locale (qui n'était a priori jamais libérer) qui était allouée, en lieu et place de l'attribut.
 
En revanche, un destructeur public pour une classe singleton, c'est vraiment très étrange, pas du tout dans l'état de l'art (et casse-gueule dans environ 100 % des cas)
 
Bonne continuation !


Message édité par Farian le 15-12-2014 à 08:03:49

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Pointeur intelligent et singleton [résolu]

 

Sujets relatifs
[Resolu][VBA]pointeur sur une sous-feuille dans un sous formulaireAide sur une fonction retournat un pointeur sur char. Merci
Pointeur sur tableau de structuretableau de pointeur sur structure dans une structure
déclaration d'un vector de pointeurDifférence entre pointeur de pointeur et vector de pointeur
vecteur de vecteur ou pointeur de pointeurComment récupérer la forme du pointeur souris n'importe où sous window
Générateur de chiffres à la suite d'une formulepointeur de tableau 2D d'entiers...
Plus de sujets relatifs à : Pointeur intelligent et singleton [résolu]


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR