Dans ton cas précis, vu que Observer est abstrait, c'est pas que ça va planter, c'est surtout que ça va pas compiler du tout !
Mais sinon oui, c'est tout à fait ça.
Le code que tu nous montres est équivalent à celui-ci :
1 2 3 4 5 6 7 8 9
|
int main(void)
{
ConcretObserver temp_observer;
ConcretObserver c = temp_observer; // Classe implémentant observeur
Ball temp_ball;
Ball b = temp_ball;
b.addObserveurs(&c);
} |
ce qui est donc strictement équivalent à ceci, sachant que les variables temporaires ne sont pas utilisées :
1 2 3 4 5 6 7
|
int main(void)
{
ConcretObserver c; // Classe implémentant observeur
Ball b;
b.addObserveurs(&c);
} |
Cela va planter à coup sûr si tu fais ce genre de choses dans une fonction, car l'objet c va être détruit dès la fin de la portée (c'est-à-dire le premier "}" rencontré). Le pointeur ainsi enregistré dans ton vecteur sera donc invalide (i.e. pointe sur un objet détruit).
Voilà ce que tu dois faire pour que c ne soit pas détruit à la fin de la portée : utiliser la création dynamique.
1 2 3 4 5 6 7
|
int main(void)
{
Observer c* = new ConcreteObserver(); // Classe implémentant observeur
Ball b;
b.addObserveurs(c);
} |
Ce que t'as dit r0d, concrètement, c'est qu'il ne faudra pas oublier de détruire (avec delete) l'objet pointé par c au moment où tu voudras enlever cet objet du vecteur d'observeurs. Si tu ne le fais pas, c'est la fuite mémoire : un objet alloué dynamiquement devient inaccessible (plus aucun pointeur ne pointe dessus) sans avoir été détruit.
Vu les questions que tu poses, je suis quasi-persuadé que tu as appris la POO avec le Java. Si c'est bien le cas, je te conseille vivement de lire un cours sur le C++ en mettant de côté ce que tu sais sur le Java.
Notamment, on écrit pas « Ball b = Ball(); » !
Partager