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 :

Passage de this dans un constructeur


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut Passage de this dans un constructeur
    Bonjour,

    J'ai une classe A qui a différent objets dont un objet de classe B.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A{
      protected:
        B * m_b;
        ...
      public:
        void methode();
    }
    };
    J'ai besoin d'appeler une méthode de A dans l'objet m_b.

    J'ai donc passé le pointeur this au constructeur de B.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A;
    class B{
      public:
        B(A * a){ m_a = a;} 
      protected:
        A * m_a;
    };
    }
    L'objet m_b était créé ainsi : m_b = new B(this) (dans A).

    Tout marchait bien jusqu'à ce que j'ai eu besoin de passer le pointeur de A au sein d'un objet C contenu dans B. J'ai utilisé la même méthode que précédemment mais voici le genre d'erreur de compilation qu'il m'affichait :

    In file included from main_window.hh:20, //A
    from treeviewpopup.h:24, //C
    from treeviewpopup.cpp:12:
    onrequestbox.h:40: // B
    erreur: «TreeviewPopup» does not name a type

    En recherchant sur le net, je me suis aperçu que le passage par référence étant plus approprié.

    J'ai donc remanié le code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A{
      protected:
        B * m_b;
        ...
      public:
        void methode(){ m_b = new B(*this);};
    }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A;
    class B{
      public:
        B(A& a):m_a(&a), m_c(a){}; 
      protected:
        A * m_a;
        C m_c;
    };
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A;
    class C{
      public:
        C(A& a):m_a(a){}; 
      protected:
        A * m_a;
    };
    }
    Le compilateur me sort toujours les mêmes erreurs.
    Je suis en perdu, comment faire ?

  2. #2
    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
    J'ai un peu de mal a suivre, mais la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class C{
      public:
        C(A& a):m_a(a){}; 
      protected:
        A * m_a;
    };
    Tu initialises un pointeur avec une reference, ca ne peut pas compiler...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Oups, petite erreur de frappe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class C{
      public:
        C(A& a):m_a(&a){}; 
      protected:
        A * m_a;
    };

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Pourquoi stocker A sous forme de pointeur et pas une référence constante (si tu ne dois pas changer de A, ce qui a l'air d'être le cas)?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class C{
      public:
        C(A& a):m_a(a){}; 
      protected:
        const A & m_a;
    };

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Je ne peux pas rendre A constant, parce que je l'utilise dans le constructeur d'une autre classe qui la veux non constant.

    Par contre je peux le stocker en référence, j'ai testé ça marche.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Ca ressemble à une variante d'un problème de référence croisée.

    MAT.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Et bien oui c'est cela.

    J'avais pensé aux déclarations anticipés mais pas à basculer les includes dans le cpp. Tout marche très bien maintenant.

    Merci pour le coup de main.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/05/2009, 18h22
  2. Réponses: 3
    Dernier message: 22/03/2009, 14h08
  3. Réponses: 7
    Dernier message: 22/10/2006, 18h51
  4. Warning lors du this passé dans un constructeur
    Par NicolasJolet dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2006, 09h43
  5. Réponses: 5
    Dernier message: 12/03/2006, 14h38

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