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