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 link avec une fonction ami


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Problème de link avec une fonction ami
    J'ai une classe Parcelle dont voici la définition :
    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
    #ifndef PARCELLE_H
    #define PARCELLE_H
     
    #include <iostream>
     
    #include <string>
     
     
     
    class Parcelle
    {
    public:
        Parcelle();
        Parcelle(std::string section, int numero);
        void afficher(std::ostream &out);
     
        friend std::ostream& operator <<( std::ostream&, const Parcelle& );
     
    protected:
        std::string pe_section;
        int pe_numero;
    private:
    };
     
     
    #endif // PARCELLE_H
    Cette classe contient une fonction ami qui me permet d'écrire dans la console.
    Le problème est que lorsque je veux lier mon programme il ne me trouve pas cette fonction ami.
    Mais que ce passe t il ?

    obj\Debug\main.o||In function `main'
    I:\cada\main.cpp|10|undefined reference to `operator<<(std::ostream&, Parcelle const&)'|
    ||=== Build finished: 1 errors, 0 warnings ===|
    Je vous met l'implémentation de la classe

    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
    41
    42
    43
    44
    45
    46
    #include "Parcelle.h"
     
    #include <iostream>
     
     
     
    /** @brief Parcelle
      *
      * @todo: document this function
      */
     Parcelle::Parcelle()
    {
     
    }
     
    /** @brief Parcelle
      *
      * @todo: document this function
      */
     Parcelle::Parcelle(std::string section, int numero) : pe_section(section),pe_numero(numero)
    {
     
    }
     
     
    /** @brief afficher
      *
      * @todo: document this function
      */
    void Parcelle::afficher(std::ostream &out)
    {
    out<<"Section : "<<pe_section<<" numero : "<<pe_numero<<std::endl;
    }
     
     
     
     
    /** @brief opérateur de sortie
      *
      *
      */
    std::ostream& operator<<( std::ostream& out, Parcelle& terrain )
    {
        terrain.afficher(out) ; // <- Changement ici
        return out;
    }

    et le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
    #include "Parcelle.h"
     
    using namespace std;
     
    int main()
    {
        Parcelle azer("AC",1);
        cout<<azer<<endl;
        return 0;
    }
    Je vous remercie pour l'aide précieuse que vous pourrez m'apporter

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    C'est, tout simplement, parce que tu n'as pas implémenté la méthode que tu as déclarée...

    D'un coté, tu déclare une fonction (oprator<<) prenant comme paramètres une référence sur un ostream (non constant) et une référence constante vers un objet de type Parcelle, et, de l'autre coté, tu implémente une fonction (operator <<) prenant comme paramètres... une référence sur un ostream (non constant) et... une référence non constante sur un objet de type Parcelle.

    Autrement dit, la réponse courte aurait très bien pu être:
    il manque un const avant Parcelle& dans l'implémentation

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci de ta réponse c'était effectivement la solution.
    Par contre au lieu de rajouté un const avant Parcelle& dans l'implémentation comme tu me l'as suggéré j'ai supprimé le const qui était dans la définition.
    Sinon le compilateur le renvoyait une erreur :
    I:\cada\Parcelle.cpp|44|error: passing `const Parcelle' as `this' argument of `void Parcelle::afficher(std::ostream&)' discards qualifiers|
    Alors si quelqu'un a une petite explication je suis preneur.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    A vrai dire, tu as toujours intérêt à laisser const ce qui peut l'être, et la solution la plus cohérente aurait donc été de
    • rajouter le const sur la référence sur objet de type Parcelle dans l'implémentation de l'opérateur
    • rendre la méthode "afficher" constante, étant entendu que rien dans cette méthode n'est sensé modifier la Parcelle

    au final, la délcaration de l'opérateur << serait
    friend ostream& operator<< (ostream&, const Parcelle&)
    avec l'implémentation qui va bien, et, pour ce qui concerne la méthode afficher, tu aurais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher(ostream&) const;
    pour la déclaration et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Parcelle::afficher(ostream&) const
    {
        /*le code utile */
    }
    (en n'oubliant pas de rendre la méthode virtuelle si tu envisage de faire dériver d'autres type de ta classe Parcelle, pour assurer le polymorphisme)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci pour tes explications, mon code fonctionne donc je mets mon message en résolu.

    Encore merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/01/2008, 16h55
  2. Problème avec une fonction utilisateur !
    Par nalou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 17h06
  3. Réponses: 6
    Dernier message: 03/04/2006, 09h42
  4. Problème avec une fonction et un array
    Par Neal Morse dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/08/2005, 12h04
  5. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33

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