Bonjour,
J'ai un problème lors de la génération du code en c++. Je souhaiterai déplacer/supprimer des include car ils me posent des problème lors de la compilation de mon code.
Prenons un exemple, j'ai modéliser deux classes A et B. La classe B hérite de la classe A.
J'ai de plus une composition entre A et B pour dire qu'une instance de B peut contenir plusieurs instances de A et chaque instance de A contient aucune ou une instance de B.
Il existe une fonction inline de A qui utilise une fonction membre de B.
Je génère la classe A dans les fichiers a.cpp et a.h. La classe B dans les fichiers b.cpp et b.h.
A cause de ma fonction inline, le générateur va remplacer la définition de B dans "a.h" par un include vers "b.h".
Hors ce n'est pas le comportement que je souhaite. En effet, ce comportement provoque une erreur au moment de la compilation de a.cpp à cause du jeu d'include: a.cpp inclus a.h, le fichier a.h inclus le fichier b.h avant la définition de la classe A. Le compilateur essaye d'hériter la classe B à partir de la classe A qu'il n'a pas encore lu et génère une erreur.
J'aurais voulu que le générateur laisse class B; avant la déclaration de la classe A et fasse un include entre la définition de la classe A et l'implémentation des fonctions inline.
Voici le header a.h que souhaiterai voir générer:Après se pose un autre problème à la compilation de b.cpp à cause du jeu include, ifndef, define. "b.cpp" inclu "b.h", "b.h" inclu "a.h" avant de définir B et "a.h" ne peut pas inclure "b.h" parcequ'il a déjà été lu et qu'il est protégé par le ifndef/define au début du fichier. Le seul moyen est de position le #include "a.h" au tout début du fichier "b.h", avant le ifndef/define.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 #ifndef _A_H #define _A_H #include "b.h" class A { public: A(); ~A(); private: B *parent; public: inline void f(); void set_parent(B *value); inline MySetParent(B * parent); }; #include "b.h" // inclure b.h à ce niveau est plus utile qu'avant la définition de A. // La fonction suivante a besoin de la définition de B pour être compilée, mais la définition de A n'en a pas besoin. inline void A::f() { // Bouml preserved body begin 0001F602 parent->g(); // Bouml preserved body end 0001F602 } inline A::MySetParent(B * parent) { // Bouml preserved body begin 0001F782 // Bouml preserved body end 0001F782 } #endif
Pour résoudre tous ces problèmes d'include, y a-t-il un moyen de dire au générateur de ne pas inclure un fichier header. Ainsi je pourrai positionner mes includes manuellement.
PS : exemple en pièce jointe, projet bouml + projet de compilation avec Code::Blocks.
Partager