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 :

classe A dans B et B dans A???


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut classe A dans B et B dans A???
    Salutous,

    Je code en C++ avec VisualC++ 6.0.

    J'ai realiser une classe case, et une classe tableau.
    Dans la classe tableau je cree un tableau de case, jusque la pas de probleme:
    fichier:
    (J'ai simplifier le code a l'utile)

    case.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef CASE_H
    #define CASE_H
     
    class Ccase
    {
    public:
       int val1;
       int val2;
    }
     
    #endif
    et
    tableau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef TABLEAU_H
    #define TABLEAU_H
     
    #include "case.h"
     
    class Ctableau
    {
    public:
       Ccase tab[3];
    }
     
    #endif
    Donc la aucun probleme a la compilation ni a l'execution.
    Maintenant je voudrai que la case contiennent un pointeur sur le tableau parent que je lui passerai au constructeur:
    Le fichier case devient(pas de modification du fichier tableau.h:
    case.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 CASE_H
    #define CASE_H
     
    class Ccase
    {
    public:
       int val1;
       int val2;
     
       Ctableau* Parent; //<-- cette ligne ne passe pas
    }
     
    #endif
    Donc a priori c'est normal, il faut que j'inclus le fichier tableau.h:
    -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "tableau.h"
    class Ccase
    {
    ...
    }
    Et la du coup j'ai une erreur de syntaxe dans le fichier tableau.h:
    tableau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef TABLEAU_H
    #define TABLEAU_H
     
    #include "case.h"
     
    class Ctableau
    {
    public:
       Ccase tab[3]; // <-- Syntax error : missing ; before tab
    }
     
    #endif
    Et la j'avoue que je plante, je comprend pas pourquoi ca fait ca.:S

    Si qqun voit le truc...

    Merci

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Ah, les problèmes d'include !

    Ce que je ferais dans ton cas, c'est de nommer ta classe tableau dans case.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef CASE_H
    #define CASE_H
    class Ctableau;
     
    class Ccase
    {
    public:
       int val1;
       int val2;
     
       Ctableau* Parent; //<-- cette ligne ne passe pas
    }
    #endif
    Et d'inclure normalement case.h dans ton tableau.h.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    essay ca :

    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 CASE_H
    #define CASE_H
     
    class Ctableau;
     
    class Ccase
    {
    public:
       int val1;
       int val2;
     
       Ctableau* Parent; //<-- cette ligne ne passe pas
    }
     
    #endif
    J'aime pas les épinards... Mais alors pas du tout

  4. #4
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    L'erreur de compilation est dite de syntaxe car le fichier qui sort du précompilateur est en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class Ctableau {
    ...
      Ccase tab[3] //Ccase n'existe pas encore au moment ou le compilateur lit cette ligne !!
    ...
    }
     
    Class Ccase {
    ...
    }
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Salut ,

    Merci pour les reponses et...
    Ca marche presque, donc en fait j'inclus la classe comme vous dites ca compile, maintenant je veut utiliser ma variable parent, normal.

    Mais dans mon fichier case.cpp ca compile pas(unrecognized function listen_case) lorsque j'appelle une fonction de la classe tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Ccase::call_Papa(void)
    {
        Parent->listen_case(); // <-- ca compile pas
    }

    J'essaye alors de mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Ctableau; // Au debut du fichier case.cpp
    Ca marche pas, je teste alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "tableau.h"
    Et la ca marche.

    Donc pour le moment tout va bien.

    Question:
    Est-ce que ceci est normal? (Car il me semble pas qu'il faut faire comme ca d'habitude)
    Est-ce que c'est la bonne methode?

    Thanks

  6. #6
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    C'est normal, et c'est la seule solution.

    Les #include et #ifdef sont gérés par le précompilateur qui va réellement inclure les fichiers à l'endroit du #include. Les #if... permettent de sélectionner des parties de texte en fonction d'une valeur booléenne.
    C'est le fichier qui sort de tout ca qui sera compilé.

    Si tu regardes l'inter inclusion des fichiers au moment de compiler les .cpp, c'est la seule manière d'avoir toutes tes infos dans le bon ordre, et pour tous tes fichiers cpp.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  7. #7
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 674
    Points
    10 674
    Billets dans le blog
    3

  8. #8
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Oui c'est bien la bonne méthode:

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

    Et c'est même à utiliser le plus souvent possible, pour limiter les dépendances entre les fichiers: si dans une classe A tu n'utilise qu'un pointeur ou une référence vers B, utilise les déclarations anticipées. Si par contre tu utilises un B "par valeur", ou que tu hérites d'un B, alors tu n'as pas d'autre choix que l'include

    Imagine le schéma suivant:

    C ---------1 A -----------1 B
    (C contient un A, qui lui même contient un B)

    Imagine que tu modifies B.h ...

    Avec des includes partout dans les .h, A va être recompilé (puisqu'il include B.h), et C aussi, puisqu'il include A.h.

    Avec les forward declarations, A va être recompilé aussi (mais bon la il n'y a pas le choix ), mais par contre C n'est pas impacté -> tu ne fais qu'inclure "A.h" qui n'a aucun lien avec B.h (c'est dans le CPP que le lien est fait)

    Voilà, un bon gain de temps quand tu compiles (surtout quand les projets sont gros) !


    edit: encore une fois j'arrive trop tard
    And still we will be here, standing like statues ...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Yes,

    C'est cool merci pour les précisions.
    Honnetement, j'avais vraiment l'impression de faire nimp .
    Du coup je suis rassuré.

    Et un chti tag Resolu.

    Bye A+

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2010, 16h02
  2. Réponses: 2
    Dernier message: 25/03/2009, 10h51
  3. Classes / Propriétés avec transmission de valeur dans l'appel
    Par Marmounet dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/09/2008, 19h13
  4. Instancier une classe dont le nom est contenu dans une String
    Par fyque dans le forum Général Python
    Réponses: 15
    Dernier message: 13/06/2008, 12h33
  5. Réponses: 8
    Dernier message: 16/05/2008, 10h34

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