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 :

Question sur les classes [Débutant(e)]


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Par défaut Question sur les classes
    Bonjour,

    Je souhaite définir une classe A dont le constructeur prends comme argument un element de type B.
    Et une classe B dont le constructeur peut prendre en argument un element de type A.

    La définiton tourne en rond...

    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
     
    class A
    {
    	public : 
    	A(B _b)
    	{ //constructeur
    	}
    };
     
    class B
    {
    	public : 
    	B(A _a)
    	{ //constructeur
    	}
    };
    Je ne me souvient plus quel était le mot magique qui dit au compilateur : je définirai la classe B plus tard (promis, sans fautes) ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Bonjour,

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class A;
    class B;

    Tout simplement. :-)

    À condition toutefois d'avoir d'autres constructeurs car avec seulement ceux-ci, tu ne parviendras jamais à instancier la première classe.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Par défaut
    Je pige pas tout. J'ai ajouté tes 2 lignes au début sans succés.
    Voici mon code qui ne compile pas à la ligne 11 :

    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
    35
    36
    37
     
    class classeA
    {
    	public : 
    		int x,y;
    		classeA(int _x, int _y)
    		{
    			x=_x;
    			y=_y;
    		};
    		classeA(classeB _b)
    		{
    			x=_b.x;
    			y=_b.y;
    		};
    };
     
    class classeB
    {
    	public : 
    		int x,y;
    		classeB(int _x, int _y)
    		{
    			x=_x;
    			y=_y;
    		};
    		classeB(classeA _a)
    		{
    			x=_a.x;
    			y=_a.y;
    		};
    };
     
    int main(void)
    {
     ;
    }
    Retourne : prog.cpp:11:19: error: expected ‘)’ before ‘_b’

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Les 2 lignes en question n'apparaissent pas est-ce normal ?
    Il s'agit pourtant de la solution à ton problème : forward declaration.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Par défaut
    Voici ce que ca donne avec les 2 lignes :

    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
    35
    36
    37
    38
    39
    40
    class classeA;
    class classeB;
     
    class classeA
    {
    	public : 
    		int x,y;
    		classeA(int _x, int _y)
    		{
    			x=_x;
    			y=_y;
    		};
    		classeA(classeB _b)
    		{
    			x=_b.x;
    			y=_b.y;
    		};
    };
     
     
    class classeB
    {
    	public : 
    		int x,y;
    		classeB(int _x, int _y)
    		{
    			x=_x;
    			y=_y;
    		};
    		classeB(classeA _a)
    		{
    			x=_a.x;
    			y=_a.y;
    		};
    };
     
    int main(void)
    {
    	;
    }
    Erreur à la ligne 13 :
    prog.cpp: In constructor ‘classeA::classeA(classeB)’:
    prog.cpp:13:3: error: ‘_b’ has incomplete type

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Les forward-declaration ne fonctionnent que si A est utilisé comme pointeur dans la déclaration de la classe B et inversement, non ?

    Par contre, est-ce qu'il n'y aurait pas moyen d'utiliser l'héritage ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class C {
    C(const C& other) : x(other.x), y(other.y) {...}
    };
    class A : public C {
    A(const A& other) : C(other) {...}
    A(const C& other) : C(other) {...}
    };
    class B : public C {
    B(const B& other) : C(other) {...}
    B(const C& other) : C(other) {...}
    };

  7. #7
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    La forward declaration dit juste "Il existe une classe nomée B, je te dirais plus tard ce qu'il y a dedans". Or pour passer un B en variable ligne 13, le compilateur a besoin de savoir notamment quelle taille fait B, la forward declaration ne lui dit pas, et il n'a pas encore parsé la définition de la classe qui est plus bas dans le fichier.
    La forward declaration permet par contre de passer des références et des pointeurs. Changes ton code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    classeA(const classeB& _b)
    ...
    classeB(const classeA& _b)
    Ca devrait marcher.

    EDIT : je suis d'accord avec le post du dessus. En général on essaie d'éviter les dépendances cycliques entre les classes si c'est possible, généralement en utilisant une classe de base commune. Mais c'est pas toujours faisable, a toi de voir si c'est possible dans ton contexte.

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

Discussions similaires

  1. question sur les classes "static"
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 05/04/2009, 17h27
  2. Questions sur les classes.
    Par Lartiste007 dans le forum Débuter
    Réponses: 4
    Dernier message: 05/04/2009, 14h46
  3. Questions sur les classes.
    Par DarkSeiryu dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/02/2009, 09h21
  4. Un question sur les classes
    Par willycat dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2008, 17h55
  5. Questions sur les classes en C#
    Par greg2 dans le forum C#
    Réponses: 11
    Dernier message: 05/11/2007, 19h57

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