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