Bonjour à tous,
Ma question est un peu particulière, et ressemble a si méprendre a "Bonnet blanc ou Blanc bonnet ?"
En effet lors de la création d'header, il arrive de faire des référances circulaires. On les bloquent par des #define et #ifndef et on ajoute des class ; pour les définitions. La question n'est pas là.
Imaginons cette exemple :
J'ai une classe A et une classe B, les deux se connaissent (j'ai donc besoin d'un include de A dans B et vise versa)
Deux solutions s'oppose:
Solution 1 : tout dans les Headers
Code A.h : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #ifndef __A_H #define __A_H #include "B.h" Class B; Class A { private : B * __b; }; #endif // __A_H
Code A.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #include "A.h" /*code vide pour la demo*/
Code B.h : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #ifndef __B_H #define __B_H #include "A.h" Class A; Class B { private : A * __a; }; #endif // __B_H
Code B.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #include "B.h" /*code vide pour la demo*/
Avantages :
- Pas de pollution de .h dans les .ccp (seullement le .h reliant le .cpp)
- Déclaration des Class X et des includes (.h) dans le même fichier
Solution 2 : un peu partout
Code A.h : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef __A_H #define __A_H Class B; Class A { private : B * __b; }; #endif // __A_H
Code A.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include "A.h" #include "B.h" /*code vide pour la demo*/
Code B.h : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef __B_H #define __B_H Class A; Class B { private : A * __a; }; #endif // __B_H
Code B.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include "B.h" #include "A.h" /*code vide pour la demo*/
Avantages :
- J'en cherche toujours ...
Bien évidement dans les deux solutions si il y a des référancements non-circulaire à faire ils sont mis dans le .h et non dans le .cpp.
Conclusion :
Personnelement je trouve la solution 1 bien meilleur, mais on m'a dit "non, c'est pas bien faut coder la solution 2", et à la question "Pourquoi ?" je n'obtiens qu'un "Parce que c'est comme ca !" (pédagogie quand tu nous tiens ... )
Je cherche donc déséperement à connaitre le fin mot de l'histoire et savoir si ma facon de faire (solution 1) est mauvaise et pourquoi ?
Me doutant que c'est une question "Bonnet blanc ou Blanc bonnet ?" je veux savoir si l'un est plus efficace que l'autre, si l'un pose problème (norme ISO a tout hasard etc ...)
Merci d'avance
Marge
Partager