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

C++ Discussion :

dependances cycliques


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut dependances cycliques
    Bonjour, j'ai un problème d'architecture de programme.
    Existe-t-il des moyens de résoudre les problèmes de dépendances cycliques. Mon exemple concret est le suivant :
    j'ai une classe 'arbre' qui contient des éléments de type noeuds et feuilles.
    j'aimerais que mes noeuds et feuilles aient un pointeur sur l'arbre auquel ils appartiennent.

    donc arbre include noeuds qui include arbre => problème.

    comment se résolvent ce genre de trucs ?

  2. #2
    Sh.
    Sh. est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Par défaut
    je pense que le forum algorythme serai le plus approprié pour avoir une réponse

  3. #3
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    ça n'a pas grand chose à voir avec de l'algorithmique...

    Je pose cette question ici au cas où il existerait une solution technique, une astuce liée au language, ou une méthode de conception indépendante du language qui traite ce type de problèmes.

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Tu cherches peut etre à faire ça:
    http://c.developpez.com/faq/cpp/?pag...erence_croisee

  5. #5
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    ok, ça me semble pas mal, je vais regarder ça... merci

  6. #6
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    Mmmm finallement bof.
    Je réussis à coder 2 classes A et B, A contient un pointeur sur un élément de type B et B contient un pointeur sur un élément de type A.

    Mais il m'est impossible d'appeler à la fois dans les méthodes de B les méthodes propres à l'élément A et dans les méthodes de A les méthodes propres à l'élément B.
    C'est à dire qu'apparement dans les méthodes d'UNE des deux classes (A ou B) je n'ai pas le droit d'appeler les méthodes propres à l'élément de l'autre classe (resp B ou A), ce qui détruit tout l'intéret de la double inclusion.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Normalement il n'y a aucun problème avec cette méthode, montre nous donc ton code et les erreurs que te jette le compilo.

  8. #8
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    voilà du code, j'ai essayer d'épurer les trucs qui n'étaient (j'espère) pas liés au problème.


    LLGENOTYPETREEELEMENT_H
    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
    #ifndef LLGENOTYPETREEELEMENT_H
    #define LLGENOTYPETREEELEMENT_H
     
    using namespace std;
    class LLGenotypeTree;
     
    class LLGenotypeTreeElement
    {
    protected :
    	LLGenotypeTreeElement * _Parent;
    	LLGenotypeTree * _Tree;
    public :
    	virtual LLGenotypeTreeElement * SetChild1(LLGenotypeTreeElement *)=0;	
    };
    #endif
    LLGENOTYPETREE_H

    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
    #ifndef LLGENOTYPETREE_H
    #define LLGENOTYPETREE_H
     
    #include "LLGenotypeTreeBinaryOperator.h"
    #include "LLGenotypeTreeUnaryOperator.h"
    #include "LLGenotypeTreeLeaf.h"
     
    class LLGenotypeTree
    {
    private :
    	LLGenotypeTreeElement * _Root;
     
    public :
    	float Evaluate(int X, int Y, int Z){return _Root->Evaluate(X,Y,Z);};	
    };
     
    #endif

    Dans LLGenotypeTreeBinaryOperator qui est un LLGenotypeTreeElement, j'ai par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LLGenotypeTreeElement * LLGenotypeTreeBinaryOperator :: SetChild1(LLGenotypeTreeElement * Child1)
    {
    	_Tree->IncrNextAddress();
     
    }
    Et à la compilation il me met :
    error C2027: use of undefined type 'LLGenotypeTree'
    pour cette ligne en particulier, et pour d'autres

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il n'y a rien de magique, pour utiliser une classe il fuat avoir inclus son en-tête. La déclaration anticipée ne sert qu'à déplacer cette inclusion du .h au .cpp, ce qui évite les problèmes d'inclusions cycliques.

    Donc tu as oublié d'inclure LLGenotypeTreeElement.h dans LLGenotypeTreeBinaryOperator.cpp, je dirais.

  10. #10
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    ok, peut être ce sera plus clair là dessus :
    je comprends pas ce qu'il faut faire pour être capable de faire ce que ce programme semble vouloir faire ( si vous avez rien compris à cette phrase, c'est normal )


    B.h

    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
    #ifndef B_H
    #define B_H
     
    class A;
     
    class B
    {
    	A * LeAdeB;
     
    public :
    	void methodeB(){LeAdeB->trucA();};
    	void trucB(){int i=0;};
    };
     
    #endif
    A.h

    Code : 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 A
    {
    	B * LeBdeA;
     
    public :
    	void methodeA(){LeBdeA->trucB();};
    	void trucA(){int i=0;};
    };
     
    #endif
    cela me met à la compil, ce qui me parait normal :
    error C2027: use of undefined type 'A'
    à la ligne
    void methodeB(){LeAdeB->trucA();};

    c'est normal puisqu'à ce stade, on ne connait rien de A sinon que c'est une classe qui existe vu qu'on a dit qu'elle éxistait sans rien lui dire d'autre.
    Donc je me demande comment résoudre ce problème

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "B.h"
     
    // ...
    B.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "A.h"
     
    // ...
    Bien sûr, puisque seul le .cpp connait la classe, il ne faut pas mettre de code utilisant celle-ci dans l'en-tête, comme dans ton exemple précédent.

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    "Déinlinise" ton code. Et applique la méthode de la FAQ.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    comme ça il me met encore une erreur, ( fatal error C1010: unexpected end of file while looking for precompiled header directive) :

    A.h
    Code : 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
    #include "B.h"
    class A
    {
    	B * LeBdeA;
    public :
    	void methodeA();
    	void trucA();
    };
     
    #endif
    A.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "A.h"
    #include "B.h"
    void A :: methodeA()
    {
    	LeBdeA->trucB();
    }
    void A:: trucA()
    {
    	int i=0;
    }
    B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef B_H
    #define B_H
    class A;
    class B
    {
    	A * LeAdeB;
    public :
    	void methodeB();
    	void trucB();
    };
    #endif
    B.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "B.h"
    #include "A.h"
     
    void B :: methodeB()
    {
    	LeAdeB->trucA();
    }
     
    void B :: trucB()
    {
    	int i=0;
    }

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    C'est un problème de réglage du compilo (VC) ou de ';' oublié à la fin d'une définition de classe.
    Problème classique, fais une recherche là dessus.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  15. #15
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut Merci !
    Ok les gars merci de m'avoir répondu aussi rapidement, c'est sympa.

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

Discussions similaires

  1. shared_ptr et dependance cyclique
    Par Trii42 dans le forum C++
    Réponses: 5
    Dernier message: 30/11/2014, 04h22
  2. Dependence cyclique A+B+C est different de C+B+A
    Par Goupil dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2006, 14h03
  3. Les différences entre association et dépendance ?
    Par sephile dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 12/01/2005, 13h43
  4. [JBuilder X][Exécutable] Gestion de dépendances
    Par marevinc dans le forum JBuilder
    Réponses: 3
    Dernier message: 16/11/2004, 09h08
  5. Packages - problème de dependances
    Par Invité dans le forum Administration système
    Réponses: 3
    Dernier message: 14/06/2004, 10h46

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