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 :

definition partielle de classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par défaut definition partielle de classe
    Bonjour a tous,

    je suis confronté a un probleme assez genant. Plutot qu'un long discours, voici le code qui pose probleme :
    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
     
    class B;
     
    class A
    {
     private:
      B *b;
     public:
      A(){}
      void set_b(B* _b){
       this->b = _b;
       this->b->print(); // <--- ceci pose probleme 
      }
    };
     
     
    class B
    {
    	private:
    		A a;
    	public:
    		B(){}
    		void set_a(A _a){this->a = _a;}
    		void print();
    };
     
    int main() 
    {
    	A a;
    	return 0;
    }
    a la compilation de ce code, j'obtiens le resultat suivant :

    test.cpp: In member function ‘void A::set_b(B*)’:
    test.cpp:9: erreur: invalid use of undefined type ‘struct B’
    test.cpp:1: erreur: forward declaration of ‘struct B’



    Le fait est que j'ai besoin d'appeler une methode de la classe B dans A sachant que B n'est definit que partiellement.
    Auriez-vous une solution pour remedier à ce probleme ?

    Merci d'avance,

    Sam

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Hello,



    Ensuite il faut que tu définisses ta fonction utilisant dans le .cpp correspondant de ta classe, où tu pourras inclure le .h définissant B. La classe B sera alors connue et il n'y aura plus aucun souci

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par défaut
    Désolé pour la balise [code] ... post modifié

    Ensuite, j'ai pas bien compris ce que tu voulais dire.

    Pour décrire un peu mieux ce qu'il se passe,
    J'ai deux classes A et B.

    A contient un pointeur vers B parmis ses attributs.
    B contient une instance de A parmis ses attributs.
    l'une des fonctions de A utilise une methode defini (*plus tard*) dans B.

    Pour les fichiers, et l'organisation des sources, j'ai fait ce petit exemple pour illustrer de maniere plus simple le probleme... mais a priori, ce n'est pas le cas, donc voici la version multi fichiers :

    A.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
    15
     
    class B;
     
    class A
    {
    	private:
    		B *b;
    	public:
    		A(){}
    		void set_b(B* _b){
    			this->b = _b;
    			this->b->print(); // <<<<<<<<<< le probleme vient d'ici ! sans cette ligne, aucun probleme.
    		}
     
    };
    B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "A.h"
    class B
    {
    	private:
    		A a;
    	public:
    		B(){}
    		void set_a(A _a){this->a = _a;}
    		void print();
    };
    test.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main() 
    {
    	A a;
    	/* manipulation de a */
    	return 0;
    }
    J'espere que c'est plus clair maintenant

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    C'est ce que je disais dans mon premier post (et ce qu'a dit Niark13 mais vos posts se sont peut être croisés) :

    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
     
    //Fichier A.h
    class B;
     
    class A
    {
    	private:
    		B *b;
    	public:
    		A(){}
    		void set_b(B* _b);
    };
     
    //Fichier A.cpp
     
    #include "B.h"
     
    void A::set_b(B* _b) {
        this->b = _b;
        this->b->print();
    }

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par défaut
    Merci pour vos réponses, en effet c'etit là mon erreur. Je me souviens maintenant avoir déja été confronté à ce problème. L'équivalent en 1 seul fichier est le suivant :
    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
     
     
    class B;
     
    class A
    {
     private:
      B *b;
     public:
      A(){}
      void set_b(B* _b);
    };
     
     
    class B
    {
    	private:
    		A a;
    	public:
    		B(){}
    		void set_a(A _a){this->a = _a;}
    		void print();
    };
     
    void A::set_b(B* _b);{
      this->b = _b;
      this->b->print();
    }
     
    int main() 
    {
    	A a;
    	return 0;
    }
    En effet, on doit definir le patron de la classe B avant de définir le corps des methodes de A utilisant des objets de B.

    Encore une fois, merci

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Par défaut
    Personnellement, je séparerais l'interface et l'implémentation.

    Un fichier a.h avec :
    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
    {
    private:
        B *b;
    public:
        A(){}
        void set_b(B* _b);
     
    };
    Et un fichier a.cpp avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "a.h"
    #include "b.h"
     
    void A::set_b(B* _b)
    {
        this->b = _b;
        this->b->print();
    }

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

Discussions similaires

  1. Definition d'une classe dans une structure
    Par circe dans le forum Langage
    Réponses: 7
    Dernier message: 02/12/2009, 17h54
  2. Réponses: 10
    Dernier message: 24/09/2009, 18h49
  3. Definition d'une classe dérivée d'un template
    Par franc82 dans le forum Langage
    Réponses: 15
    Dernier message: 29/07/2008, 16h44
  4. Definition d'une classe python dans plusieurs fichiers
    Par wfargo dans le forum Général Python
    Réponses: 3
    Dernier message: 05/12/2006, 23h03
  5. Réponses: 8
    Dernier message: 23/11/2006, 11h30

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