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 de référence croisée


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut Problème de référence croisée
    Bonjour,

    Je travaille sur 3 classes.
    Si on schématise, on aurait les classes A, B et C.

    La classe A va créer des objets B.
    La classe A va créer des objets C.

    La classe B a besoin d'accéder à la classe A.
    La classe C a besoin d'accéder à la classe A.

    Jusque là, ca va. J'obtiens ceci :

    Classe A.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class B;
    class C;
     
    class A:
    {	
    public:
        A();
    }
    Classe A.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "A.h"
    #include "B.h"
    #include "C.h"
    ---------------------------------------------------------------

    Classe B.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "A.h"
     
    class B:
    {	
    public:
        B();
    }
    Classe B.cpp :
    ---------------------------------------------------------------

    Classe C.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "A.h"
     
    class C:
    {	
    public:
        C();
    }
    Classe C.cpp :

    Toutefois, maintenant, j'aurais besoin que mes objets <B> puissent accéder aux objets <C> instantiés par ma classe <A>.
    Exemple : objetB->createurObjetA->objetC->...

    Je ne comprends pas comment faire

    Si j'essaie de faire comme indiqué ci-dessus, mon compilateur me retourne une erreur du type :
    "Invalid use of undefined type 'struct <C>'"

    Auirez-vous une idée, s'il vous plait ?
    Merci d'avance pour votre aide

  2. #2
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Bonjour,

    as-tu regardé cette faq ?

  3. #3
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    C'est bien de simplifier le code mais pas trop quand même, car si je le prend tel quel il n'y a aucunes raisons pour que B.h et C.h fassent un #include "A.h" !

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    C'est à partir de cette FAQ que j'ai fait mes classes, précisément.
    Toutefois elle ne répond pas à mon problème

    J'ai une solution tout simple : <A> possède des fonctions qui permettent d'acceder (get/set/...) et de modifier les variables dont j'ai besoin dans <B> et <C>.
    Lorsque <B> veut modifier l'objet <C> instantié par <A>, il ne le connait pas réelement puisqu'il n'a pas eu d'include de C.h mais seulement une défnition de classe pour le compilo.

    Maintenant, l'objet <B> peut appeler la fonction de <A> qui va modifier l'objet <C>.

  5. #5
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Je ne vois pas où est ton problème :

    A dépend de C : car A contient un attribut de type C
    B dépend de A (et donc de C) : car B utilise une méthode de A qui lui renvoi un objet de type C

    Il n'y a pas de référence croisée, à moins que tu ne nous dit pas tout.

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Comme je l'ai dit dans mon premier post :

    <A> crée un objet <B>. Cet objet <B> a besoin d'intervenir sur son créateur <A>.
    <A> crée un objet <C>. Cet objet <C> a besoin d'intervenir sur son créateur <A>.

    Ca nous fait deux références croisées, sauf si je n'ai rien compris à la FAQ
    Et c'est en plus de ce méli-melo que l'objet <B> cherche à accéder à l'objet <C> créé par <A>

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    L'objet A peut retourner un objet B. Pour les déclarations on doit juste savoir que B existe.
    => mettre "class B;" dans le header de A
    => inclure le header de B dans le fichier source de A

    L'objet B contient une référence/un pointeur sur un objet A, et éventuellement des fonctions avec A en paramètre/retour
    => mettre "class A;" dans le header de B

    L'objet B utilise effectivement l'implémentation de A
    => inclure le header de A dans le fichier source de B

  8. #8
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par Nyphel
    <A> crée un objet <B>. Cet objet <B> a besoin d'intervenir sur son créateur <A>.
    <A> crée un objet <C>. Cet objet <C> a besoin d'intervenir sur son créateur <A>.
    Un petit bout de code pour éclaircir tout ça ?

    Car "<A> crée un objet <B>" ça veut dire une instance de B ou bien un pointeur sur instance de B ?
    Et "B à besoin d'intervenir sur son créateur <A>", soit, mais ou ça (à l'intérieur d'une méthode B, à l'intérieur d'une méthode de A, ailleurs) ?

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Il s'agit de pointeurs.

    Les constructeurs de <B> et <C> attendent un pointeur sur un objet de type <A > comme argument, de sorte à pouvoir appeler des méthodes de l'objet <A> et modifier quelques variables de status.

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    À nouveau, rien de problématique. Pour utiliser un pointeur sur A, tu n'as pas besoin de savoir ce que c'est que A, tu dois juste déclarer que cette classe existe. Exemple :

    A.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef H_A
    #define H_A
    class B;
     
    class A {
        ...
        B createB();
        B *createBptr();
    };
    #endif // H_A
    A.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "A.h"
    #include "B.h"
     
    ...
     
    B A::createB() {
        B b(this);
        return b;
    }
     
    B *A::createBptr() {
        return new B(this);
    }
    B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef H_B
    #define H_B
    class A;
     
    class B {
        ...
        A *createur;
    };
    #endif // H_B
    B.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include "B.h"
    #include "A.h"
     
    ...

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    D'accord merci beaucoup, là je comprends mieux

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

Discussions similaires

  1. Problème de déclaration avec références croisées
    Par lpierard dans le forum Débuter
    Réponses: 2
    Dernier message: 20/11/2009, 15h10
  2. [Template] problème de références croisées
    Par ded jay dans le forum C++
    Réponses: 3
    Dernier message: 24/08/2008, 15h20
  3. Gros problème de conception : référence croisée
    Par Baptiste Wicht dans le forum Général Java
    Réponses: 14
    Dernier message: 26/04/2007, 13h14
  4. Problème de référence de données circulaire
    Par Wismerhill50 dans le forum Langage
    Réponses: 3
    Dernier message: 23/10/2005, 22h38
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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