je cite :
on voit que l'on a suivit les instructions que vous nous avez donné
dans le cours par rapport aux static dans un module c'est-à-dire:
-ne pas mettre en public
OK
-la laisse visible dans l'interface du module
incorrect: l'attribut est visible dans l'interface de la classe (ça c'est OK) ce qui est différent de l'interface du module (ça c'est la cause du problème).
relisez le deuxième slide: on indique de ne jamais mettre une déclaration/initialisation d'une variable static dans l'interface d'un module. C'est dans l'implémentation du module qu'il faut le faire
Dans le contexte du slide2, la video précise que les conséquences ne sont pas dramatiques: ça compile et produit un exécutable; le problème est seulement de créer des variables static partout où l'interface du module est incluse.
Dans le contexte d'un attribut de classe il ne faut pas non plus initialiser un attribut de classe dans l'interface d'un module. la conséquence est la détection d'une erreur par l'éditeur de liens (réponse B) car l'attribut de classe est défini/initialisé 2 fois:
1) quand on inclut rect.h dans rect.cc pour l'étape de compilation qui produit rect.o (cette étape de compilation elle-même ne détecte rien).
2) quand on inclut rect.h dans prog.cc pour l'étape de compilation qui produit prog.o (cette étape de compilation elle-même ne détecte rien).
La double définition n'est pas détectée à l'étape de la compilation parce qu'il s'agit de 2 compilations séparées complètement indépendantes qui ignorent ce qui est fait par l'autre compilation. En particulier, chaque compilation a réservé de l'espace mémoire pour l'attribut static. Vous pouvez compiler séparément et vous verrez qu'il n'y a pas d'erreur:
g++ -std=c++11 rect.cc -c
g++ -sdt=c++11 prog.cc -c
C'est l'étape d'édition de liens qui assemble rect.o et prog.o et qui détecte la double réservation d'espace mémoire pour l'attribut de classe: d'où l'erreur qui stoppe la production de l'exécutable
Conclusion, pour un attribut de classe aussi, c'est dans l'implémentation du module qu'il faut l'initialiser.