begin process at 2012 05 30 09:49:43
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Singleton et héritage


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Singleton et héritage

mercredi 15 juin 2005 à 16:06:27 | Singleton et héritage

Dany82

Voila mon probleme:
J'utilise le template:

template <typename T>
class singleton
{
protected:
 // Constructor/Destructor
 singleton( ) {
 }
 // Supprime l instance de la classe si elle a été crée
 ~singleton( ){
  if( m_pInstance != NULL ){
   delete m_pInstance;
   m_pInstance = 0;
  }
 }

public:
 // renvoie une instance de la classe, la crée si elle n existe pas
 static T *GetInstance( void ){
  if( m_pInstance == NULL ){
   m_pInstance = new T;
  }
  return ((T *)m_pInstance);
 }

private:
 static T *m_pInstance;    // instance unique de la classe

};

template <typename T> T *singleton<T>::m_pInstance = NULL;

J'ai 3 classes:
A, B et C

A singleton
B hérite de A
C utilise le singleton A
Mon probleme est le suivant, lorsque j'initialise B cela crée une classe mere A, qui n'est pas prise en compte pour le m_pInstance. Et du coup, lorsque je récupere A dans C, j'obtiens 2 classes A différentes, au lieu d'une.
Comment faire pour éviter cela?

mercredi 15 juin 2005 à 16:46:28 | Re : Singleton et héritage

vecchio56

Administrateur CodeS-SourceS
Le constructeur par defaut de A est appelé quand tu crée un objet B. Tu n'a qu'a mettre ici que c'est le singleton

A::A()
{
  if(m_pInstance)
  {
    // deja une instance, tu fais ce que tu veux ici
  }
  else m_pInstance = this;
}

mercredi 15 juin 2005 à 17:02:17 | Re : Singleton et héritage

cosmobob

salut,
tu as un probleme de conception. le constructeur de A devrait etre en private (et tu déclares en friend la class singleton<A>).
Par ce que la il y a un biais dans ton singleton, a savoir qu'il n'est pas le seul a pouvoir creer une instance de A ...
Du coup avec un constructeur de A en private, tu aurais vu que tu peux pas initialiser B ...
Et tu te serais demandé l'interet de faire dériver A en une autre classe ?? tu peu pas utiliser A comme classe de base de deux sous classes, parce que tu auras des problemes d'instances ... Reference un pointeur A* vers ton singleton A dans B, comme tu le fais dans C, et t'auras aucun problème.


a+

mercredi 15 juin 2005 à 17:03:54 | Re : Singleton et héritage

cosmobob

vecchio56> ce que tu proposes ne résout pas le problème, si ?
mercredi 15 juin 2005 à 17:08:38 | Re : Singleton et héritage

vecchio56

Administrateur CodeS-SourceS
Bah si, on aura jamais deux instances avec ca, puisqu'on controle à la création si une instance est deja présente. C'est vrai que dans le code qu'il donne au debut on a accès au constructeur, donc on peut créer autant d'instances qu'on veut
mercredi 15 juin 2005 à 17:13:45 | Re : Singleton et héritage

cosmobob

oui mais si tu crées un objet de type B; sa partie A a des chances d'etre différente de A::GetInstance() (il suffit que cette méthode ait déja été appelée avant de creer un objet B)
Si tu fais ca:
A* ptr = A::GetInstance();
B obj;
A* ptrviaB = &obj;

on voit bien que ptrviaB et ptr sont deux pointeurs vers un objet de type A mais qui est différent (d'ailleurs ils ont trivialement une adresse differente)

donc le probleme demeure ... non?

mercredi 15 juin 2005 à 17:24:54 | Re : Singleton et héritage

vecchio56

Administrateur CodeS-SourceS
Ou j'ai écrit // deja une instance, tu fais ce que tu veux ici, j'ai supposé qu'on supprimait l'instance qui existe deja (dans ce cas ton ptr n'existe plus a partir du moment ou on crée B), ou qu'on faisait un exception (B ne peut pas être construit).
mercredi 15 juin 2005 à 17:56:32 | Re : Singleton et héritage

Dany82

Merci pour toutes ces reponses.
En effet l'ordre a une importance, mais ca sembe fonctionner en verifiant les ordres d'appel.


Cette discussion est classée dans : instance, classe, template, singleton, pinstance


Répondre à ce message

Sujets en rapport avec ce message

Constructeur sur un tableau de classes [ par Supo ] Lorsque je crée un tableau de classe, disons avecnomdelaclasse instance[10];et que j'ai un constructeur pour cette classe, comment je fait pour donner Erreur de link en utilisant les templates [ par Wett ] Voila j'utilise VC++ 6 et j'ai créé une classe templates toute simple (en fait c une liste chainée :p), de la formedans le .h:template class ChainList Passer une instance de classe dans une mémoire partagée ?? [ par vinvay ] Comment puis-je passer une instance de classe dans une shared memory, sachant que cette classe contient une structure. J'arrive, dans le deuxième prog template dll ou autre??? [ par Bilock ] Bonjour,j'aimerai créer un programme chargeant des dll de traitement audio temps réel.J'aimerai que ces dll contiennent une classe que je puisse insta template? [ par payen ] Salut a tous,je programme actuellement une bibli de traitement d'images en C++, et j'ai un p'tit souci. En fait, j'ai cree une classe image qui contie classe derivee de template [ par payen ] Salut a tous,juste une petite question sur les template et les classes derivees ... j'ai donc une classe template declarre comme suit: Suppression d'une instance de classe avec patron [ par jeanlandercy ] Bonjour,Je découvre avec joie les patrons de classe. J'ai dans l'idée de créer un patron de maillon pour liste. La conception, c'est ok, mais la suppr template [ par ifren ] salutje veux utilise une classe D utilisant une variable qui peut etre double ou string, je deirve de cette dernier deux autre class Dnum et Dstrpour template et héritage [ par cybermax62 ] j'ai un problème de fond dans ma conception. Je voudrais utiliser une classe template de base Singleton avec des classes héritées (plusieurs fois). Le pb d'importation d'une classe template à partir d'une DLL avec Visual Studio .NET [ par Diabolus ] Salut,J'ai un problème d'importation à partir d'une DLL.Je souhaite importer une classe qui est de type template dans mon application.J'ai réussi à im


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,182 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales