IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

BOUML Discussion :

héritage, composition et fonctions inline


Sujet :

BOUML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 79
    Points : 78
    Points
    78
    Par défaut héritage, composition et fonctions inline
    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:
    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
    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.

    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.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonjour,
    Citation Envoyé par ArnaudD Voir le message
    La classe B hérite de la classe A.
    ...
    Il existe une fonction inline de A qui utilise une fonction membre de B.
    soi dit en passant je pense qu'il y a là une erreur d'architecture, de façon générale une classe mère ne doit pas connaitre ses classes filles ...

    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.
    ... et le compilateur te dit la même chose

    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.
    oui : il suffit d'éditer l'artifact pour retirer ${includes} dans l'onglet C++ source et / ou C++ header suivant ce que l'on souhaite.

    Il est également possible de retirer la génération des déclarations dans le fichier header en retirant la macro ${declarations}

    si tu veux vraiment faire ce que tu souhaites il te suffira de plus d'insérer tes #include avant #ifndef _${NAME}_H. Une autre solution étant de simplement déplacer ${includes} avant #ifndef _${NAME}_H

    mais franchement, tu ferais mieux de revoir ton architecture et le rôle de tes deux classes
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 79
    Points : 78
    Points
    78
    Par défaut
    Citation:
    Envoyé par ArnaudD Voir le message
    La classe B hérite de la classe A.
    ...
    Il existe une fonction inline de A qui utilise une fonction membre de B.
    soi dit en passant je pense qu'il y a là une erreur d'architecture, de façon générale une classe mère ne doit pas connaitre ses classes filles ...
    Merci de ta réponse, je pensais utiliser la variable membre parent pour remonter mon arbre, mais je vais voir si je ne peux pas faire autrement, histoire d'avoir une architecture plus propre

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    vu que je n'ai pas de renseignement sur le but de tes classes je ne peux pas plus t'aider, si nécessaire tu peux demander de l'aide dans le forum DC
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 79
    Points : 78
    Points
    78
    Par défaut
    En fait, ma classe A représente un inode, ma classe B un répertoire. Il existe une troisième classe fichier qui dérive aussi de ma classe inode.

    Ma classe répertoire peut contenir tout type d'inodes (répertoires, fichiers).

    Je voulais faire une fonction qui puisse pour n'importe quel inode récupérer ses détails, récupérer ces fichiers sur le disque ou ailleurs. Chaque inode était capable de récuperer son chemin absolue en faisant appel à la fonction GetPath de son père (La fin de la récursivité étant gérer par une classe "répertoire racine").

    La fonction GetPath est à l'origine de mon problème d'architecture.

    Mais je peux résoudre mon problème en supprimant cette fonction et en donnant comme paramètre au constructeur de l'inode le chemin du père. Du coup je supprime ma classe répertoire racine.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/11/2006, 12h49
  2. Fonction Inline ?
    Par dimmu dans le forum C++
    Réponses: 25
    Dernier message: 25/08/2006, 14h51
  3. Fonctions inline
    Par vdumont dans le forum C++
    Réponses: 5
    Dernier message: 12/05/2006, 19h40
  4. héritages multiples et fonctions abstraites
    Par julien.sagnard dans le forum C++
    Réponses: 4
    Dernier message: 21/10/2005, 14h58
  5. Fonctions inlines et fichiers .lib
    Par michhh dans le forum C++
    Réponses: 3
    Dernier message: 05/07/2005, 03h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo