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 :

include cyclique : problème


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut include cyclique : problème
    Bonjour,

    J'ai un fichier A.h qui à besoin de B.h et B.h à besoin de A.h.
    Le problème, c'est que les include font tout planter quand je les met dans les fichiers .h

    Vous aller me dire que c'est simple : il suffit de faire les include dans les .cpp, le problème c'est que je n'ait pas de .cpp étant donné que tout mon code se trouve dans les .h (template oblige)

    Que faire ?

  2. #2
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Par défaut
    Salut,

    il faut mettre des entetes a tes fichiers .h.
    Pour ton fichier A.h, tu mets ces deux lignes en entête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef AH
    #define AH
    et en toute fin de fichier tu mets
    Et pareil pour le fichier B.H en mettant BH au lieu de AH.
    Ca gère ce problème de d'inclusion dans une inclusion, dans un inclusion ...

    En espérant que ça règle ton problème.

  3. #3
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ca ne règlera pas grand chose, ce que tu décris ne résoud que les problèmes de définition multiple.

    Solution :
    http://c.developpez.com/faq/cpp/?pag...erence_croisee

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    En effet, ça ne résoud pas mon problème gér@rd lambert.

    Merci Laurent pour ce lien mais je le connais déjà et il me semble qu'il ne m'aide pas pour mon problème étant donné que la définition de mes méthodes se trouve dans les .h (template) et donc un simple "class B;" ne suffit pas !

  5. #5
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans ce cas la seule solution est de mettre les deux classes dans le même en-tête, de cette manière :

    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
    template <typename> class B;
     
    template <typename T>
    class A
    {
        void Func(B<T>& b);
    };
     
    template <typename T>
    class B
    {
        void OtherFunc(A<T>& a);
    };
     
    template <typename T>
    void A<T>::Func(B<T>& b)
    {
       ...
    }
     
    template <typename T>
    void B<T>::OtherFunc(A<T>& a)
    {
       ...
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Mouais, c'est pas cool
    Merci

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    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
    43
    44
    45
    46
    47
    48
    49
    // a.hpp
    #ifndef A_HPP
    #define A_HPP
    template <typename> class B;
     
    template <typename T> struct A {
       void f(B<T>);
    };
     
    #include "a.tpp"
    #endif
     
    // a.tpp
    #if defined(A_TPP) || !defined(A_HPP)
    #error "a.tpp" must not be included directly.
    #else
    #define A_TPP
    #include "b.hpp"
     
    template <typename T> 
    void A::f(B<T> x) {
       x.f(*this);
    }
    #endif
     
    // b.hpp
    #ifndef B_HPP
    #define B_HPP
    template <typename> class A;
     
    template <typename T> struct B {
       void f(A<T>);
    };
     
    #include "b.tpp"
    #endif
     
    // b.tpp
    #if defined(B_TPP) || !defined(B_HPP)
    #error "b.tpp" must not be included directly.
    #else
    #define B_TPP
    #include "a.hpp"
     
    template <typename T> 
    void B::f(A<T> x) {
       x.f(*this);
    }
    #endif

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #if defined(A_TPP) || !defined(A_TPP)
    Euh...
    Ce ne serait pas plus simple de faire un #if 1 ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #if defined(A_TPP) || !defined(A_TPP)
    Euh...
    Ce ne serait pas plus simple de faire un #if 1 ?
    J'ai corrigé, il fallait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #if defined(A_TPP) || !defined(A_HPP)

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

Discussions similaires

  1. Problèmes de #include cycliques
    Par alpha35 dans le forum Débuter
    Réponses: 2
    Dernier message: 19/12/2009, 16h18
  2. Adieu les frames, bonjour les includes, mais.. problème !
    Par Phoenix0007 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/12/2009, 20h02
  3. #include cyclique ?
    Par chwem dans le forum Débuter
    Réponses: 4
    Dernier message: 19/02/2009, 17h47
  4. [Include] Un problème d'imbriquation?
    Par Shadowm@n dans le forum C++
    Réponses: 4
    Dernier message: 14/06/2008, 18h26
  5. [Include][Subview]Problème de passage de paramètres
    Par kiki-le-vrai dans le forum JSF
    Réponses: 1
    Dernier message: 18/06/2007, 14h23

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