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 l'Opérateur d'affichage C++ <<


Sujet :

C++

  1. #1
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut Question Sur l'Opérateur d'affichage C++ <<
    Bonjour,
    Voici mon code:
    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
    53
    54
    55
    56
    57
    58
     
    #include <iostream>
    #include <cmath>
    using namespace std;
     
    enum Pavillon { JollyRogers, CompagnieDuSenegal, CompagnieDOstende };
     
    enum Etat { Intact, Endommage, Coule };
     
    int sq(int x)
    {
      return x*x;
    }
     
    class Coordonnees
    {
    public:
      Coordonnees(int un_x, int un_y) : x_(un_x), y_(un_y) {}
      int x() const {
        return x_;
      }
      int y() const {
        return y_;
      }
      void operator+=(Coordonnees const& autre); 
    private:
      int x_;
      int y_;
    };
     
    class Navire
    {
    private:
    	Coordonnees position_;
    protected:
    	Pavillon pavillon_;
    	Etat etat_;
    public:
    	Navire(int x, int y, Pavillon p) :
    		position_(x, y), 
    		pavillon_(p), 
    		etat_(Etat::Intact) {};
    	Coordonnees position() const { return position_;  }
    	void avancer(int de_x, int de_y) {
    		position_ += Coordonnees(de_x, de_y);
    	}
    	void renflouer() { etat_ = Etat::Intact; }
    	friend std::ostream& operator <<(std::ostream&, const Coordonnees&); 
    	void afficher(ostream& sortie) const {
    		sortie << " en " << position_
    			   << " battant pavillon " << pavillon_
    			   << ", " << etat_;
    	}
    };
    ostream& operator<< (ostream& sortie, Coordonnees const& c) {
    	sortie << "(" << c.x() << ", " << c.y() << ")";
    	return sortie;
    }
    J'ai eu deux erreurs:
    L'une au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	Navire(int x, int y, Pavillon p) :
    et l'autre au niveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sortie << " en " << position_
    erreur: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'

    Avez-vous une idée ?
    Merci d'avance pour l'aide.
    Cordialement.
    La science ne connaît qu'une loi: la contribution scientifique.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	friend std::ostream& operator <<(std::ostream&, const Coordonnees&);
    n'a rien à faire dans la classe Navire, elle doit être placée dans la classe Coordonnees.

  3. #3
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    En fait, j'ai pas le droit de modifier la classe Coordonnees.
    Je dois commencer le développement de la solution juste après :
    La science ne connaît qu'une loi: la contribution scientifique.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Alors supprime carrément cette ligne
    Elle ne sert de toute façon pas vu que tu utilises les méthodes d'accès x() et y() dans la définition. Elle le serait si tu voulais utiliser directement les attributs privés x_ et y_.

  5. #5
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Merci pour vos réponse. c'est résolu le deuxième point et il me reste le premier point concernant le constructeur..
    Avez vous une idée ?
    Merci beaucoup.
    La science ne connaît qu'une loi: la contribution scientifique.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Déjà, quel est le message d'erreur ?

  7. #7
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Je m'excuse.. en fait c'est au niveau du constructeur de la classe fille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Pirate : public Navire {
    public:
    	Pirate(int x, int y, Pavillon p) 
    		: Navire(x, y, p) {};
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bateaux.cc:80:7: note:   candidate expects 1 argument, 0 provided
    bateaux.cc:80:7: note: constexpr Pirate::Pirate(Pirate&&)
    bateaux.cc:80:7: note:   candidate expects 1 argument, 0 provided
    Merci d'avance.
    La science ne connaît qu'une loi: la contribution scientifique.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Le message d'erreur entier aiderait plus..
    En tout cas cela semble provenir de l'utilisation que tu fais du constructeur de Pirate tu ne lui fournirais aucun argument alors que lui en demanderait (3 j'imagine avec ce que tu montre), c'est tout ce que je peux te dire avec ces trois petites lignes.
    Le début du message te dira où exactement.

  9. #9
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Ok, merci.
    J'ai une dernière question svp:
    Classe Navire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ostream& afficher(ostream& sortie) const {
    	sortie<<" en ("<<position_.x()<<", "<<position_.y()<<") battant pavillon "<<pavillon_<<", "<<etat_; 
    	return sortie;
    	}
     
    ...
    };
    ostream& operator<< (ostream& sortie, Navire const& n) {
    	n.afficher(sortie);
    	return sortie;
    }
    Classe Pirate: fille de Navire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void afficher(ostream& sortie) const {
    		sortie << "bateau pirate";
    		Navire::afficher(sortie);
    	}
    à l'affichage d'un bateau pirate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Pirate ship1(0, 0, JollyRogers);
      cout << ship1 << endl;
    j'ai pas eu l'expression "bateau pirate" au début de la phrase !

    Merci d'avance.
    La science ne connaît qu'une loi: la contribution scientifique.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Rends ta méthode afficher() virtuelle, et ça devrait aller mieux

  11. #11
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Merci. J'ai fait les changements nécessaires mais j'ai pas eu l'affichage convenable:
    Classe Navire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    virtual ostream& afficher(ostream& sortie) const {
    	sortie<<" en ("<<position_.x()<<", "<<position_.y()<<") battant pavillon "<<pavillon_<<", "<<etat_; 
    	return sortie;
    	}
    Dans l'affichage:
    à l'affichage d'un bateau pirate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Pirate ship1(0, 0, JollyRogers);
      cout << ship1 << endl;
    bateau pirate ...... le pavillon_ est 0 et l'état_ est 00x6f....
    Ma surcharge (externe) de l’opérateur d’affichage << pour les Pavillons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            ostream& operator<< (ostream& sortie, Pavillon const& p) {
    	switch(p) {
    	case Pavillon::JollyRogers: sortie << "pirate"; break;
    	case Pavillon::CompagnieDuSenegal: sortie << "français"; break;
    	case Pavillon::CompagnieDOstende: sortie << "autrichien"; break;
    	default: sortie << "pavillon inconnu"; }
    	return sortie;
    }
    Et j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend ostream& operator<< (ostream&, Pavillon const&);
    dans la classe Navire juste avant la méthode afficher..

    Merci d'avance.
    La science ne connaît qu'une loi: la contribution scientifique.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par chercheur111 Voir le message
    Et j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend ostream& operator<< (ostream&, Pavillon const&);
    dans la classe Navire juste avant la méthode afficher..
    Non cette ligne n'a rien à y faire, de même que précédemment.

    Déclarer une fonction en friend dans une classe permet de pouvoir accéder à ses attributs privés directement sans aucun besoin de getter. Mais cela ne concerne que la classe elle-même.

    Pavillon est un enum, à portée "globale", tu n'as donc aucun besoin de ce genre de ligne, où que ce soit.

    EDIT : à voir l'accolade qui ferme, tu sembles avoir mis sa définition dans la classe Navire ? Non, il faut la mettre à l'extérieur, indépendamment.

  13. #13
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Oui, ceci est à l'extérieur de la classe Navire (après la classe Navire).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ostream& operator<< (ostream& sortie, Pavillon const& p) {
    	switch(p) {
    	case Pavillon::JollyRogers: sortie << "pirate"; break;
    	case Pavillon::CompagnieDuSenegal: sortie << "français"; break;
    	case Pavillon::CompagnieDOstende: sortie << "autrichien"; break;
    	default: sortie << "pavillon inconnu"; }
    	return sortie;
    }
    Le problème est que la méthode afficher de Navire ne reconnait pas << de Pavillon .. est-ce qu'il y une solution pour résoudre ce pb sans déplacer le code de << de Pavillion avant la classe Navire ?
    La science ne connaît qu'une loi: la contribution scientifique.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Si tu peux mettre la déclaration avant oui, sinon faire utiliser à Navire quelque chose dont il ignore l'existence va être un peu dur

  15. #15
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    D'accord. Merci bien pour toutes vos remarques.
    Il me reste une erreur dans le cadre de cette même problématique:
    Dans la classe Navire j'ai une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void rencontrer(Navire& n) {
    		if(etat_ != Etat::Coule
    			&& n.etat_ != Etat::Coule
    			&& pavillon_ != n.pavillon_
    			&& distance(n) < Navire::rayon_rencontre) { 
    				attaque(n); 
    				n.replique(*this);
    		}
    Qui m'a généré l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fatal error in "test_navire_rencontrer": memory access violation at address: 0x7fffa8889ff8: no mapping at fault address
    Je ne sais pas si vous avez une idée sur la cause de telle erreur .. Merci d'avance pour votre réponse.
    Cordialement.
    La science ne connaît qu'une loi: la contribution scientifique.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Là comme ça je ne vois rien de suspect.

  17. #17
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Utilise un debuger, il s'arrêtera sur la ligne qui pose problème et tu pourras constater ce que tu as en mémoire.
    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.

  18. #18
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    J'utilise Geany .. est-ce qu'il offre cette fonctionnalité ?
    La science ne connaît qu'une loi: la contribution scientifique.

  19. #19
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Vraiment l'erreur m'a bloqué ..
    J'essaye d'analyser avec vous, peut être j'aurais la solutio
    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
    Class Navire{
    //
    double distance(Navire const&, Navire const&);
    	double distance(Navire const& n) {
    		return distance(*this, n);
    	}
    };
    double distance(Navire const& n1, Navire const& n2) {
    	Coordonnees a(n1.position()), b(n2.position());
    	return distance(a,b);
    }
    double Navire::distance(Navire const& n1, Navire const& n2) {
    	return ::distance(n1, n2);
    }
    Ce code ne me génère pas l'erreur, mais je voudrais avoir une solution comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...............
    double distance(Navire const& n1, Navire const& n2) {
    	Coordonnees a(n1.position()), b(n2.position());
    	return distance(a,b);
    }
    double Navire::distance(Navire const& n1, Navire const& n2) {
    	return distance(n1, n2);
    }
    Ce code me génère le problème du mémoire...
    Mon objectif est de trouver une solution qui marche sans utiliser " ::" devant return..
    La science ne connaît qu'une loi: la contribution scientifique.

  20. #20
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    En renommant les fonctions pour y voir plus clair
    Le premier code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double foo(Navire const& n1, Navire const& n2) {
    	Coordonnees a(n1.position()), b(n2.position());
    	return distance(a,b);
    }
    double Navire::distance(Navire const& n1, Navire const& n2) {
    	return foo(n1, n2);
    }
    Le second
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double foo(Navire const& n1, Navire const& n2) {
    	Coordonnees a(n1.position()), b(n2.position());
    	return distance(a,b);
    }
    double Navire::distance(Navire const& n1, Navire const& n2) {
    	return distance(n1, n2);
    }
    Boucle infinie, stack overflow, toutes ces joyeusetés.

    Si les fonctions ont le même nom, les "::" sont obligatoires (et c'est tout à fait légal en C++. Ce n'est pas une mauvaise pratique.).
    Si tu ne veut pas de "::", il va falloir renommer une fonction.

    edit : une solution, sans renommer, serait d'avoir une fonction membre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Navire {
    	double distance(const Navive& rhs) const {
    		Coordonnees a(position()), b(rhs.position());
    		return distance(a,b);
    	}
     
    	static double distance(const Navire& lhs, const Navire& rhs) {
    		return lhs.distance(rhs);
    	}
    };

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Question sur la zone d'affichage sur l'écran
    Par Bundy*Al dans le forum OpenGL
    Réponses: 1
    Dernier message: 30/05/2008, 22h59
  2. Question sur l'opérateur ::
    Par johnkro dans le forum Langage
    Réponses: 8
    Dernier message: 14/03/2008, 10h13
  3. Questions sur l'opérateur <<
    Par coyotte507 dans le forum C++
    Réponses: 4
    Dernier message: 18/11/2007, 22h54
  4. Question sur les listes d'affichage
    Par brouss dans le forum OpenGL
    Réponses: 3
    Dernier message: 08/03/2007, 12h56
  5. question sur les opérateurs
    Par isidore dans le forum C++
    Réponses: 10
    Dernier message: 25/02/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