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

Langage C++ Discussion :

probleme de surcharge de l'opérateur<<


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut probleme de surcharge de l'opérateur<<
    qulequ'un peut me dire c'est quoi le probleme avec ce code i!!!
    parce que ce code génére des erreurs
    PS: je travaille sous Microsoft visual C++ 6

    voila mes classes :
    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
     
    #include<iostream>
    #include<string>
    using namespace std;
     
    class vehicule  
    {
    protected:
    	string imatriculation;
    	string marque;
    	double kilometre;
    	string date_mise_circulation;
    public:
    	vehicule();
    	vehicule(string ,string, double, string);
    	void affiche();
    	 friend ostream & operator<<(ostream &sortie, vehicule & v );
    };
    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
    // vehicule.cpp: implementation of the vehicule class.
    #include<iostream>
    #include "vehicule.h"
    using namespace std;
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
     
    vehicule::vehicule()
    {
    	 imatriculation="";
    	 marque="";
    	 kilometre=0;
    	 date_mise_circulation="";
    }
     
    vehicule::vehicule(string matr,string marq, double km, string date)
    {
    	imatriculation=matr;
    	marque=marq;
    	kilometre=km;
    	date_mise_circulation =date;
    }
     
     
    void vehicule::affiche()
    {
    	cout<<"la vehicule de matrucule: "<<imatriculation<<"\t de marque: "<<marque<<endl;
    }
     
    ostream& operator<<(ostream & sortie,vehicule & veh)
    {
    	sortie<<"la vehicule de matrucule: "<<veh.imatriculation<<"\t de marque: "<<veh.marque<<"\tkm: "<<veh.kilometre<<endl;
    	return sortie;
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Quel message d'erreur ? (un rapide coup d’œil ne m'a rien montré)
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut
    voila l'erreurs:

    vehicule.cpp
    vehicule.cpp(50) : error C2248: 'imatriculation' : cannot access protected member declared in class 'vehicule'
    vehicule.h(18) : see declaration of 'imatriculation'
    vehicule.cpp(50) : error C2248: 'marque' : cannot access protected member declared in class 'vehicule'
    c:\users\boub\workspacec++\gestion agence assurence\vehicule.h(19) : see declaration of 'marque'
    vehicule.cpp(50) : error C2248: 'kilometre' : cannot access protected member declared in class 'vehicule'
    vehicule.h(20) : see declaration of 'kilometre'
    Error executing cl.exe.

    Gestion agence assurence.exe - 3 error(s), 0 warning(s)
    j'ai utiliser operator<< comme amie pour éviter cette situation
    aussi lorsque j' ai exécuté ce code en devC++ sa marche b1 !!

  4. #4
    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,

    Avant de répondre :
    1. Tu devrais utiliser les listes d'initialisation pour tes constructeur... C'est "simplement" préférable
    2. Tu ne devrait pas utiliser la directive using namespace std; dans un fichier d'en-tête: Avec le jeu des inclusions en cascade, cela propagera la directive de manière plus ou moins anarchique, et cela ne peut que finir par poser problème
    3. Pourquoi placer les membres dans l'accessibilité protégée De prime abord, ils seraient bien mieux dans l'accessibilité privée
    4. VS6 est... anti déluvien, et il me semblerait bien plus intéressant de passer à un compilateur un peu plus récent (imagine: il VC6 date d'avant la première standardisation de C++, ou de juste après)
    5. Tu devrais veiller à déclarer toute fonction n'ayant pas vocation à modifier ton objet (je pense à la fonction affiche) comme étant constante. Cela te mettra en excellente situation pour mettre en place le respect de ce qui est connu sous le nom de const correctness
    6. Plutot que d'utiliser explicitement cout à l'intérieur de la fonction affiche(), étant donné que le résultat sera le meme quel que soit le flux envisagé, pourquoi ne pas rajouter un argument de type ostream & à la fonction :question
    Ceci dit, l'erreur est relativement simple: il faut passer ton véhicule sous la forme d'une référence constante à l'opérateur <<

    Les conseils 5 et 6 feraient que ta fonction affiche ressemblerait au final à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void vehicule::affiche(std::ofstream & os) const
    {
    	os<<"la vehicule de matrucule: "<<imatriculation<<"\t de marque: "<<marque<<endl;
    }
    ce qui te permettrait alors de supprimer l'amitié avec l'opérateur << et d'avoir un code pour celui-ci ressemblant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // remarque que je passe le véhicule sous la forme d'une référence constante ;)
    ostream& operator<<(ostream & sortie,vehicule const & veh)
    {
    	veh.affich(sortie);
    	return sortie;
    }
    Cela aurait, de plus, l'avantage de te faire respecter un conseil souvent cité en eXtreme Programming: DRY (Don't repeat Yourself, ou, si tu préfères en français: ne vous répétez pas)
    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

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par renalte16 Voir le message
    qulequ'un peut me dire c'est quoi le probleme avec ce code i!!!
    parce que ce code génére des erreurs
    PS: je travaille sous Microsoft visual C++ 6
    L'erreur est peut être là : Microsoft visual C++ 6.
    Ton code compile sans problème avec les compilateurs récents.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Je crois qu'il ne se conforme même pas à la norme (je en parle évidemment pas d C++11).

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. [C#] Surcharge de l'opérateur ==
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/07/2006, 16h19
  3. Réponses: 6
    Dernier message: 12/07/2006, 15h34
  4. Probleme de surcharge de flux
    Par BigBeni dans le forum C++
    Réponses: 20
    Dernier message: 01/05/2006, 19h10
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

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