
GoldenCrystal (./1045) :
des solutions plus moisies les unes que les autres (cf ./1042 …)
Folco (./1064) :
Un objet A construit lors de sa propre construction deux objets B et C en tant que membres privés.
L'objet B se construit normallement.
La construction de C échoue et il lance une exception.
Si A n'intercepte pas l'exception, mais qu'elle est récupérée par une "catch all" général à la base du programme (genre dans main()), alors B sera perdu dans la nature ?Ca veut donc dire que c'est à A d'intercepter l'exception lancée par C pour nettoyer B avant de lancer sa propre exception ?
aze (./1072) :
note que dans ce cas, il vaut mieux utiliser un std::auto_ptr ou équivalent pour contenir B* et C*. un auto_ptr va détruire automatiquement l'objet pointé quand le pointeur dest détruit, contrairement à un pointeur normal. et là, plus besoin de try/catch dans A
Kevin Kofler (./1087) :
Une solution est que si le constructeur échoue, on construit un objet non valide et on rajoute une méthode isValid.
)
Surtout que je n'ai que moi comme seul utilisateur, et je me frapperai pas si j'oublie de vérifier une validité
Folco (./1088) :Kevin Kofler (./1087) :
Une solution est que si le constructeur échoue, on construit un objet non valide et on rajoute une méthode isValid.
Ca me tente bien. Des objections ?


Flanker (./1044) :Nil (./1039) :
Bah j'aurais pas fait exactement comme squalyl en fait, tiens... j'aurais surchargé les méthodes setWidth et setHeight pour qu'elles aient le même comportement (c'est à dire son setcote, quoi). Pas besoin d'un setcote.
Pareil
Rectangle c = new Carré(); c.setWidth(10); c.setHeight(20); System.out.println(c.getWidth() + "x" + c.getHeight());
JackosKing (./1101) :
Pour le deuxième sujet, l'exception est vraiment moche. Et je tenais juste à préciser qu'il ne faut pas mélanger construction et initialisation d'un objet.

JackosKing (./1103) :
C'est surtout que si le carré derive du rectangle, il doit passer le teste unitaire du rectangle...

Folco (./1105) :JackosKing (./1101) :
Pour le deuxième sujet, l'exception est vraiment moche. Et je tenais juste à préciser qu'il ne faut pas mélanger construction et initialisation d'un objet.
Tu peux préciser les deux points stp, aussi bien sur l'initialisation que l'exception ?
edit -> en fait, je pense faire la différence entre création et initialisation (création des objets composants l'objet en question VS initialisation des pointeurs via des new, des différentes données à des valeurs précises et de l'appel aux initialisateurs des autres objets). C'est pas ça ?Si oui, pourquoi différencier les deux ? C'est pas cool de pouvoir tout mettre dans le constructeur et lancer une exception au cas où ya le moindre truc qui déconne ?
Classe objet; // objet n'est pas encore initialisé/utilisable if (!objet.init()) FAIL; // initialise l'objet, retourne true (succès) ou false (échec)
Classe objet; // initialise l'objet, peut échouer if (!objet.isValid()) FAIL;
Classe objet; // objet n'est pas encore initialisé/utilisable // ici, objet.isValid() == false bool valid1 = objet.init(); bool valid2 = objet.isValid(); // ici, valid1 == valid2 if (!valid1) FAIL;
// La construction ne peut pas échouer; par défaut tout composant est unitaire, // placé à (0, 0), blanc, de centre (0, 0) etc. donc l'état initial est connu et // cohérent pour l'utilisateur GLRectangle rect = new GLRectangle(); rect.Move(10, 10).Size(20, 20).Rotate(30).Draw();
// La construction *peut* échouer (exception) car une image sans texture
// n'en est pas une...
GLImage img = new GLImage("test.png");
img.SetColor(Color.Green).Draw();
Brunni (./1102) :
Ce n'est pas bon, parce que:
Rectangle c = new Carré(); c.setWidth(10); c.setHeight(20); System.out.println(c.getWidth() + "x" + c.getHeight()); Il est difficile de dire à quoi s'attendre... 20x20 sera le résultat, mais ça aurait pu être 10x10 ou même 10x20 en toute logique (mais à ce moment le carré est dans un état incohérent). Bref c'est pour ça qu'un carré n'est pas un rectangle, d'où ma solution ^^