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 :

Probleme de surcharge d'operator<<


Sujet :

C++

  1. #1
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut Probleme de surcharge d'operator<<
    Voici mon problème:

    J'ai un fichier .h qui ressemble à ça.
    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
    #ifndef PERSONNE_H
    #define PERSONNE_H
     
    class Personne
    { 
    protected:
        char * nom;
        char * pnom;
        int age;
    public:
    	//friend class Appreciation;
        Personne(); // personne par defaut
        Personne(char * n, char * p, int a); 
    	Personne(Personne& p); // constructeur copie
    	Personne operator=(Personne& p); // operator d'affectation
        ~Personne();
    	void Modifier();
    	void virtual Afficher();
    	void virtual afficher(std::ostream& out);
    };
     
    #endif
    ensuite

    dans main() j'ai la définition suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Personne::afficher(ostream& out)
    {
         out << "Fonction affichage...." << endl; 
    }
    plus loin, juste avant main() j'ai un truc qui ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ostream &operator<<( ostream &out, Personne &pers )
    {
        pers.afficher(out) ; 
        return out;
    }
    .. et enfin la cerise sur le gateau, j'ai une erreur belle comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    no `void Personne::afficher(std::ostream&)' member function declared in class `Personne'
    ..C'est grave docteur?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Par habitude, je met toujours le mot "virtual" en premier dans les prototypes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    virtual void afficher(std::ostream& out);
    au lieu de
    void virtual afficher(std::ostream& out);
    Ce ne serait pas cela qui perturberai le compilateur par hazard ? (sans conviction)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Le fait est qu'il est totalement illogique de mettre virtual au beau milieu de la déclaration.

    Tu mets d'abord la caractérisation de la fonction (qui peut comprendre inline, virtual, etc.), puis ce qui constitue sa signature.

  4. #4
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut
    Mais si vous remarquez, j'ai une méthode intitulée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void virtual Afficher();
    ... et qui pourtant marche. (D'ailleurs, concernant le mot clé "virtual" le manuel de Delanoy dit qu'il peut être placé avant ou après le type indifférement.

    Quoi qu'il arrive, après avoir interchargé les mots "void" et "virtual", le problème reste irrésolu.

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Il peut, mais je trouve ça absurde de le mettre après le type retourné

  6. #6
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut
    .. Je viens d'éditer mon précédent post.

    De plus je me demande si ce n'est pas une défaillance de devc++ (je vais donc essayer de recompiler ce code sur un autre compilo, pour voir si ça change quelque chose..)

  7. #7
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    salut,
    je ne comprends pas ton pb, j'ai fait ceci et ça marche avec dev-c++
    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
    47
    48
    49
    50
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    class Personne
    { 
    protected:
        char * nom;
        char * pnom;
        int age;
    public:
    	//friend class Appreciation;
        Personne(); // personne par defaut
        Personne(char * n, char * p, int a); 
    	Personne(Personne& p); // constructeur copie
    	Personne operator=(Personne& p); // operator d'affectation
        ~Personne();
    	void Modifier();
    	virtual void  Afficher();
    	void virtual afficher(std::ostream& out);
    };
     
    Personne::Personne() { /* ??? */ }
    Personne::~Personne() { /* ??? */ }
     
    void Personne::Afficher()
    {
        cout << "Fonction Affichage...." << endl; 
    }
     
    void Personne::afficher(ostream& out)
    {
         out << "Fonction affichage...." << endl; 
    }
     
    ostream &operator<<( ostream &out, Personne &pers )
    {
        pers.afficher(out) ; 
        return out;
    }
     
    int main(int argc, char *argv[])
    {
        Personne p;
        cout << p;
        p.Afficher();
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  8. #8
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut
    Le problème c'est que moi non plus je ne comprend pas, car, j'ai deux fonction virtuelle la première marche ... mais la deuxième non

  9. #9
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    j'ai modifié mon message précédent, les 2 fonctions virtuelles marchent.

  10. #10
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut
    Nouvelle découverte qui explique le mystère
    Au départ j'avais un projet ayant une class Personne sans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void virtual afficher(std::ostream& out);
    Ensuite, je crée un deuxième projet où j'importe les fichiers de mon projet précédent et auquel j'ajoute la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void virtual afficher(std::ostream& out);
    J'enregistre tout, et je compile ... mais une erreur se fait jour.

    Or lorsque j'ouvre le fichier personne.h de mon deuxième projet avec notepad, je constate que les modifications apportées n'ont pas été prises en compte.

    Et pourquoi?

    -Parce que les fichiers d'origine se trouvaient sur une clé usb, et le projet se trouvait sur un lecteur à part. Par conséquent les fichiers modifiés s'enregistraient dans la clé usb, tandis que ceux du projet demeuraint inchangés!


    ..élémentaire mon cher Watson!

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Donc ton problème est résolu ? Plus d'erreur de compilation ?

  12. #12
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut
    C'est ça.

    Et merci à vous pour m'avoir permi de mener à bien cette enquête digne du détective Linu6

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

Discussions similaires

  1. probleme de surcharge...
    Par le_voisin dans le forum Boost
    Réponses: 5
    Dernier message: 03/03/2009, 17h51
  2. [POO] Probleme de surcharge d'operateur
    Par wawa84 dans le forum C++
    Réponses: 2
    Dernier message: 19/10/2008, 20h52
  3. Réponses: 2
    Dernier message: 07/09/2006, 15h23
  4. Probleme de surcharge de flux
    Par BigBeni dans le forum C++
    Réponses: 20
    Dernier message: 01/05/2006, 19h10
  5. Réponses: 2
    Dernier message: 15/11/2005, 10h59

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