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 :

Utilisation des méthodes d'une classe à l'interieur d'une autre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Par défaut Utilisation des méthodes d'une classe à l'interieur d'une autre
    salut,

    j'ai deux classes A et B,

    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
    class A{
      -------
      -------
     
      public : 
          void A::afficher(){
              ----------
            }
    }
     
    class B{
      A *a;
      -------
     
      public :
          void B::afficher(){
               a->afficher();
           }
    }
    Chacune des deux classes est définie toute seule dans un fichier, et j'inclue "A.h" lors de la définition de la classe B.

    Mais, le compilateur me donne des erreurs en me disant qu'il n'arrive pas à trouver la fonction visée : undefined reference to `Vecteur::afficher()'

    alors que faire pour que ca passe ?

    Merci d'avance
    Bien cordialement

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La première réflexion est toute bête:

    As tu bien inclus le fichier d'en-tête A.h dans le fichier dans lequel tu fais appel à a->afficher()

    N'oublie pas que la déclaration anticipée d'une classe ne fait que dire au compilateur que telle classe existe, mais que cela ne lui dit pas ce qui compose la classe en question...Pour cela, il faut impérativement inclure le fichier d'en-tête dans lequel la classe est définie (dans lequel on donne le corps de la classe)

    La deuxième remarque est simplement d'ordre synthaxique: n'oublie pas le point virgule ";" après la parenthèse qui ferme la définition de tes classes

    La troisième remarque qui me vient à l'esprit, c'est d'être particulièrement surpris par le code tel que tu l'écris:

    Chez moi, si j'écris un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A{
      public : 
          void A::afficher(){
            }
    };
    le compilateur se plaint par une erreur "extra qualification A:: on member afficher"

    Je me pose donc la question de savoir où ta méthode est définie.

    Si tu défini une méthode au sein de la définition de la classe, il n'est pas nécessaire (et le compilateur se plaint d'ailleurs si tu le fait) de préciser la portée de la classe (ici A:

    Si tu définis la méthode ailleurs qu'au sein de la classe, la portée devient indispensable, mais, dans ce cas, n'écris pas l'implémentation de la méthode au sein de la classe quand tu présente le code sur le forum
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Par défaut
    bonjour,

    Concernant les remarques que tu m'as fait, je les ai appliqué depuis le début :
    1. #include "A.h"
    2. le point virgule à la fin de la déclaration de la classe
    3. ...


    je crois que vous ne m'avez pas bien compri

    j'ai un fichier nommé : A.h (dans lequel il y a les protoypes des fonctions et les variables et bien sûr j'ai aussi un autre fichier "A.cpp" dans lequel il y a la définition détaillée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A{
    private :
       --------
    public :
       void A::afficher();
       -----------
    }
    Quand je compile 0 Erreurs

    j'ai un autre fichier : B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "A.h"
    class B{
    private :
       A *a;
       --------
    public :
       inline void B::afficher(){ cout<<"Objet de classe B : "; a->afficher();}
       -----------
    }
    le problème c'est que lors de l'appel de la méthoe afficher de la classe A dans le corps d'une fonction membre de la classe B il me donne l'erreur : [Linker error] undefined reference to `A::afficher()'

    voila !!!
    Merci d'avance
    Bien cordialement

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    pourquoi, dans tes prototypes:
    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
    class A{
      -------
      -------
     
      public : 
          void A::afficher(){
              ----------
            }
    }
     
    class B{
      A *a;
      -------
     
      public :
          void B::afficher(){
               a->afficher();
           }
    }
    dire void A::afficher() au lieu de void afficher()?
    même remarque avec B::afficher.

  5. #5
    Membre éclairé Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Salut,

    pourquoi, dans tes prototypes:
    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
    class A{
      -------
      -------
     
      public : 
          void A::afficher(){
              ----------
            }
    }
     
    class B{
      A *a;
      -------
     
      public :
          void B::afficher(){
               a->afficher();
           }
    }
    dire void A::afficher() au lieu de void afficher()?
    même remarque avec B::afficher.
    salut,

    aaaaaaaaaah, j'y ai pas fait attention ici,
    Mais dans le code d'origine j'ai pas mis ca
    le truc des classes A et B c'est juste un exemple pour vous expliquez la situation dans laquelle je suis tombé

    Bien cordialement

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    L'idée, quand on donne un code, c'est quand même d'essayer de le donner de manière à ce qu'il soit correct...

    Ainsi, le point virgule après l'accolade fermante d'une définition de classe fait partie de la définition, et il faut donc toujours le mettre...

    Pour l'inclusion, effectivement, j'avais "zappé" une ligne.

    Enfin pour le A::afficher() et le B::afficher(), au sein de la définition de la classe, ça me fait réellement une erreur.

    Le conseil de base, quand on pose une question reste quand même toujours aide nous à t'aider.

    Pour nous aider à t'aider, essaye de fournir le code tel qu'il est chez toi, suffisant pour nous permettre de reproduire ton erreur.

    Enfin, si (et on peut éventuellement le comprendre) tu donnes des noms de classes à titre d'exemple, pense quand même à adapter le texte de l'erreur, car, ici, l'erreur fait référence à une méthode de la classe Vecteur, mais cette classe n'existe pas (ce n'est ni un classe faisant partie d'une bibliothèque couremment utilisée, ni une classe que tu nous dis avoir créée toi-même): on ne peut donc a priori pas savoir d'où vient réellement l'erreur (car, pour nous, il n'existe que la classe A et la classe B ).

    Ceci dit, quand l'éditeur de liens se plaint d'une "undefine reference to UneClasse::uneMethode()", c'est, généralement, parce que tu as déclaré la méthode (ce qui a permis au compilateur de faire son travail quand il a vu que tu l'utilisait), mais que tu ne l'as pas implémentée.

    Du coup, quand l'éditeur de liens prend le relais, il "trouve" la déclaration de la méthode, il trouve un symbole qu'il doit remplacer par l'adresse mémoire à laquelle commence cette méthode (pour l'appeler), mais il ne peut pas faire le lien entre le symbole et l'adresse mémoire.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/12/2008, 02h12
  2. Réponses: 4
    Dernier message: 06/04/2008, 18h34
  3. Héritage d'une classe MFC et d'une classe non MFC
    Par Etienne Paquette dans le forum MFC
    Réponses: 7
    Dernier message: 04/12/2007, 20h19
  4. Réponses: 2
    Dernier message: 29/03/2007, 12h02
  5. Réponses: 14
    Dernier message: 15/12/2005, 18h46

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