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

SL & STL C++ Discussion :

[Surchage d'opérateur]Encore un problème..


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Par défaut [Surchage d'opérateur]Encore un problème..
    Bonjour,

    Bon, j'ai encore un souci avec ma surchage de l'opérateur >> :
    L'application que j'ai codé utilise le polymorphisme. J'ai une classe de base Element, contenant plusieurs méthodes virtuelles pures:

    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
     
    class Element
    {
        protected:  
     
            short numero;
            float vitesse;
            Point debut;
            Point fin;
     
    	public:
     
    		Element(float _vitesse);
    		virtual void Afficher(ostream& flux) const = 0;
    .
    .
    .
    };
    Il y a 3 classes dérivées qui sont Segment, Stop et ArcCercle, qui comportent (entre autres) une méthode Afficher et la surchage de l'opérateur >> :

    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
    51
    52
     
    class Segment : public Element
    {
        private:
     
            float longueur;
            float angle;
     
    	public:
     
    		Segment(float _longueur, float _angle, float _vitesse);
    		virtual void Afficher(ostream& flux) const;
                    friend ostream& operator <<(ostream& os, const Segment& seg); 
    .
    .
    .
    };
     
    class Stop : public Element
    {
        private:
     
            float duree;
     
    	public:
     
    		Stop(float _duree, float _vitesse);
    		virtual void Afficher(ostream& flux) const;
                    friend ostream& operator <<(ostream& os, const Stop& stp);  
    .
    .
    .
    };
     
    class ArcCercle : public Element
    {
        private:
     
            float rayon;
            float angleDebut;
            float angleFin; 
            Point centre;     
     
    	public:
     
    		ArcCercle(float _rayon, float _angleDebut, float _angleFin, float _vitesse);
    		virtual void Afficher(ostream& flux) const;
                    friend ostream& operator <<(ostream& os, const ArcCercle& arc);
    .
    .
    .
    };
    Il y a ensuite la classe Trajectoire qui a comme donnée membre un vecteur qui stock toute les instances de dérivées de Element :

    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
     
    class Trajectoire
    {
        private:
     
            vector<Element*>mesElements;   
            short nbEtapes;
            Point pDepart;   
     
    	public:
     
    		Trajectoire();
    		bool Ajouter();
    		void Afficher();
    .
    .
    .
    };
    voici comment j'ai implémenté la surchage de l'opérateur << dans chaque classe dérivée de Element (ici l'implémentation dans Segment):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ostream& operator <<(ostream& os, const Segment& seg)
    {     
        seg.Afficher(os);
     
        return os;
    }
    En effet j'ai besoin de faire appel a la méthode Afficher car une surchage d'opérateur ne peut être définie comme virtuelle.
    Voici l'implémentation de la méthode Afficher dans la classe Segment (pour exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Segment::Afficher(ostream& flux) const
    { 
        flux << "\n\t   (" << numero << ") SEGMENT L = " << longueur << "m" << " A = " << angle << "rad" << " V = " << vitesse << "km/h" << endl;
    }
    Voici comment je compte utiliser la surchage, dans la méthode Afficher() de la classe Trajectoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i = 0; i < mesElements.size(); i++)
    { 
                cout << mesElements[i];
    }
    Voilà pour ce qu'il en est du contexte.
    J'ai l'impression de bien m'y être pris correctement, mais voici ce que le compilateur me répond quand je lance la compil (j'utilise Devcpp 4.9.9.2) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    17 C:\Documents and Settings\Anne Laure\Bureau\TP4\element.h variable or field `Afficher' declared void 
    17 C:\Documents and Settings\Anne Laure\Bureau\TP4\element.h `Afficher' declared as a `virtual' field 
    17 C:\Documents and Settings\Anne Laure\Bureau\TP4\element.h expected `;' before '(' token
    La ligne 17 correspond à la déclaration de la méthode Afficher dans le fichier d'en-tête de la classe Element (le premier extrait de code dans le post).

    Si vous pouviez m'éclairer sur mon erreur j'en serais très reconnaissant, Merci!

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Avais-tu vu ce point de la FAQ qui traite justement de ce probleme pour ecrire ton code ? En particulier en general on ne cree un operateur de serialisation que pour la classe de base.

    Sinon ton vecteur contient des pointeurs donc il faut les dereferencer ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << *mesElements[i];
    MAT.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Par défaut
    Oui j'avais lu le FAQ, je m'en étais même inspiré.
    Effectivement il semble logique de ne déclarer et d'implémenter la surchage que dans la classe de base (Element dans mon cas), j'ai donc modifier mon code à cet effet.
    Désolé pour la faute de frappe, j'avais oublié de mettre le * devant mesElements[i]...

    Malgré ces modifications, le compilateur me rejette toujours, avec les même messages d'erreur, avec en plus les erreurs suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    27 E:\Cours Lpro\UE2 Cruchet - Programmation Système\TP\TP4\element.h ISO C++ forbids declaration of `ostream' with no type 
     
    27 E:\Cours Lpro\UE2 Cruchet - Programmation Système\TP\TP4\element.h `ostream' is neither function nor member function; cannot be declared friend 
     
    27 E:\Cours Lpro\UE2 Cruchet - Programmation Système\TP\TP4\element.h expected `;' before '&' token
    La ligne 27 correspondant à la déclaration de la surchage d'opérateur << dans l'en-tête de ma classe Element :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    friend ostream& operator <<(ostream& os, const Element& elmt);
    Je ne comprends pas!!

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    A moins que ta classe Element soit dans le namespace std (ce qui est mal) ou que tu ais mis un using dans ton .h (ce qui est mal) ca devrait etre std::ostream et non ostream je dirais a vue de nez.

    Sinon, si ca ne resoud pas le probleme, si tu pouvais donner un exemple minimal mais complet qu'on ait juste a copier-coller en une fois le code dans un fichier et a le compiler pour tester, ca permettrait sans doute de trouver plus rapidement.

    MAT.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Par défaut
    Super!

    C'était bien ça!En fait je n'avais justement pas définie le namespace ni dans le .cpp ni dans le .h, et en mettant std::ostream& tout fonctionne nikel!
    Merci beaucoup!

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

Discussions similaires

  1. Problème surchage d'opérateur
    Par zvib4012 dans le forum C++
    Réponses: 6
    Dernier message: 15/05/2008, 15h36
  2. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  3. [surchage d'opérateur >>]problème à la compilation
    Par joe230 dans le forum SL & STL
    Réponses: 2
    Dernier message: 15/11/2007, 10h56
  4. Réponses: 8
    Dernier message: 10/08/2004, 11h49
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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