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 :

Problème avec des #include imbriqués


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 42
    Points : 33
    Points
    33
    Par défaut Problème avec des #include imbriqués
    Bonjour à tous,

    J'ai deux classe dans laquelle les en-têtes des fichiers .h ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef INSTRUCTION_H_
    #define INSTRUCTION_H_
     
    #include "Inst_if.h"
     
    class Instruction
    et pour l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef INST_IF_H_
    #define INST_IF_H_
     
    #include "Instruction.h"
     
    class Inst_if
    Le problème c'est que les deux classes s'incluent l'une et l'autre et ça me pose des problèmes de compilation...

    Sauriez vous m'aider? J'ai vraiment aucune solution sous la main...

    merci

  2. #2
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Bonjour,
    je t'invite à consulter ce topic qui vient juste d'être posté et résolu sur le même sujet
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 42
    Points : 33
    Points
    33
    Par défaut
    merci mais j'ai déjà vu cette réponse...

    N'y a t'il pas un moyen un peu plus académique de faire?

  4. #4
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Ph.denis Voir le message
    merci mais j'ai déjà vu cette réponse...

    N'y a t'il pas un moyen un peu plus académique de faire?
    Qu'est-ce qu'un "moyen plus académique"? En quoi les solutions proposées ne le sont pas?
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Ph.denis Voir le message
    merci mais j'ai déjà vu cette réponse...

    N'y a t'il pas un moyen un peu plus académique de faire?
    Que veux dire « académique » ?? Car c'est comme ça que cela s'enseigne.

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Le seul moyen de résoudre un problème d'inclusion mutuelle c'est de passer par une déclaration anticipée dans un des deux fichiers.

    Du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class MaClasse;
    struct MaStruct;
    Réfléchis au problème deux minutes et tu vas saisir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
      B b; // B encore non défini
    };
     
    class B
    {
      A a;
    };
    Tel que je l'ai écrit, ce code ne compile pas car le type B doit être entièrement connu pour construire une variable membre de ce type. On ne peut pas faire passer la définition de B au dessus car B a besoin de connaître entièrement A pour construire sa variable membre.

    La solution (y en a pas 36) c'est de passer par une déclaration anticipée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class B;
     
    class A
    {
      B & b1; // B est déclaré, ok pour un simple pointeur ou référence
      B * b2;
    };
     
    class B
    {
      A a;
    };
    Ton probleme est le même sauf que tu a mis les classes A et B dans des fichiers .h séparés.

    Cette solution n'est en rien "laide" ou "marginale".

  7. #7
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
      B b; // B encore non défini
    };
     
    class B
    {
      A a;
    };
    Tel que je l'ai écrit, ce code ne compile pas car le type B doit être entièrement connu pour construire une variable membre de ce type. On ne peut pas faire passer la définition de B au dessus car B a besoin de connaître entièrement A pour construire sa variable membre.

    La solution (y en a pas 36) c'est de passer par une déclaration anticipée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class B;
     
    class A
    {
      B & b1; // B est déclaré, ok pour un simple pointeur ou référence
      B * b2;
    };
     
    class B
    {
      A a;
    };
    Pour être fonctionnellement équivalent à la version précédente, il faut écrire quelque chose qui ne peut pas fonctionner, car la version précédente n'a pas de sens.

    Une solution qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class B;
    class A { 
    	B* b;
    public:
    	A ();
    };
    class B {
    	A a;
    };
    A::A () : b (new B) {
    }

Discussions similaires

  1. Problème de focus avec des UserControl imbriqués
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 12/01/2011, 08h19
  2. Problème avec des SQLDataReaders imbriqués
    Par Catsloveuse dans le forum Accès aux données
    Réponses: 0
    Dernier message: 11/05/2010, 10h10
  3. Problème avec des Case When imbriqués
    Par Orion01 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/11/2007, 18h49
  4. Problème avec l'include des iostreams
    Par fredonouille dans le forum SL & STL
    Réponses: 3
    Dernier message: 04/07/2007, 20h36
  5. problème avec des include
    Par nixonne dans le forum Langage
    Réponses: 4
    Dernier message: 22/08/2006, 17h12

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