zaraki21
Messages postés31Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention22 avril 2011
-
8 avril 2010 à 13:42
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
9 avril 2010 à 21:02
Bonjour,
je suis actuellement en stage et je développe une application en C++ qui utilise le mécanisme des singletons avec un constructeur et une méthode getInstance fonctionnant comme suit:
A::A(int a){
id_objet = a;
}
A* A::getInstance(int a){
if(m_instance==NULL){
if( (a>10){
m_instance = NULL;
}else{
m_instance = new ObjetA(a);
}
}
return m_instance;
}
Le problème, c'est que si je teste dans mon programme principal et que je fais appel à la méthode getInstance avec par exemple un paramètre a=12, il n'y aura pas d'objet de créé et donc si je fais appel à des méthodes de la classe par la suite, le programme "plantera". Je souhaite gérer le problème à l'aide d'exceptions. Tout d'abord, j'aimerais savoir si je dois gérer l'exception directement dans le constructeur ou dans la méthode getInstance, ou bien alors directement dans le main en sachant que j'aimerais que une fois l'exception levée je ne puisse plus par exemple appeler des méthodes de la classe(étant donne que aucun objet est créé).
Merci pour vos réponses.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 8 avril 2010 à 18:40
Y a tout de même un gros problème de conception !
Lorsque l'on fait un singleton, on ne doit pas se poser la question de qui va initialiser l'objet, ni de son unicité. Ici, l'ordre d'appel change tout et ce n'est pas normal.
- Problème 1: Un singleton doit posséder une méthode getInstance qui n'a pas d'argument. Si tu en as, ça veut dire que tu n'as pas besoin d'un singleton mais d'autre chose (peut être un Flyweight ou une méthode classique ?).
- Problème 2: Un objet doit être unique et constant: donc un singleton par type d'objet. De plus un objet dont l'initialisation dépend d'un facteur externe, ne devrait pas être un singleton.
Que cherches-tu à faire avec ce singleton ?
Pour répondre à ta question, si tu lances une exception, ce n'est pas au constructeur de la gérer, mais au code appelant. Donc ici, typiquement il faudrait lancer une exception et l'attraper via un try/catch dans ton main.
zaraki21
Messages postés31Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention22 avril 2011 8 avril 2010 à 20:46
J'ai un constructeur qui ne prend aucun paramètre ainsi qu'une méthode getInstance qui n'en prend aucun. En considérant que la méthode getInstance est une méthode comme une autre, je pense que l'on peut la surcharger non ?