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 avec operator<< friend


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut probleme avec operator<< friend
    j ai ecrit une classe time qui a les donnees de heure minutes et secondes en private,

    et j ai declare dans la classe un operateur<< qui est friend pour afficher l heure,

    le probleme est que quand j ecri la fonction et je veux la compiler il me dit cannot acces... comme si la fonction n etait pas prive!!

    remarque:

    j inclus dans mes fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include<iostream>
    using namespace std;
    mais si je met
    seulement les std que j ai besoin il ne fais pas de probleme
    par ex:
    quelqu un pourrait m aider???

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    sujet deplacé dans le forum c++

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Tu peux donner un exemple complet et minimal mettant ton probleme en evidence?

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    voici la classe time
    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
     
    #ifndef TIME_H
    #define TIME_H
     
    #include<iostream>
    using namespace std;
     
     
    class time
    {
    public:
    	friend ostream& operator<<(ostream&,const time&);
    	time(int h=0,int m=0,int s=0);
    	void setTime(int,int,int);
    	void addHour(int);
    	void addMin(int);
    	void addSec(int);
     
     
    private:
    	int hour;
    	int min;
    	int sec;
    };
     
     
    #endif

    et voici mon fichier cpp qui ne veut pas se compiler

    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
    59
    60
    61
    62
    63
    64
     
     
    #include<iostream>
    using namespace std;
     
    #include "time.h"
     
    time::time(int h,int m,int s)
    {
    	hour=((h>0 && h<24)? h:0);
    	min=((m>0 && m<60)? m:0);
    	sec=((s>0 && s<60)? s:0);
    }
     
    void time::setTime(int h,int m,int s)
    {
    	hour=((h>0 && h<24)? h:0);
    	min=((m>0 && m<60)? m:0);
    	sec=((s>0 && s<60)? s:0);
    }
     
    void time::addHour(int h)
    {
    	for(int i=0;i<h;i++)
    	{
    		hour++;
    		if(hour==24)
    			hour=0;
    	}
    }
     
    void time::addMin(int m)
    {
    	for(int i=0;i<m;i++)
    	{
    		min++;
    		if(min==60)
    		{
    			addHour(1);
    			min=0;
    		}
    	}
    }
     
    void time::addSec(int s)
    {
    	for(int i=0;i<s;i++)
    	{
    		sec++;
    		if(sec==60)
    		{
    			addMin(1);
    			sec=0;
    		}
    	}
    }
     
    ostream& operator<<(ostream& out,const time& heure)
    {
    	out<<endl;
    	out<<heure.hour<<':'<<heure.min<<':'<<heure.sec;
    	out<<endl;
    	return out;
    }
    chui desole de tout mettre mais je ne voudrais pas enlever la cause de l erreur puisque je ne sais pas qu elle est l erreur

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    chui desole de tout mettre mais je ne voudrais pas enlever la cause de l erreur puisque je ne sais pas qu elle est l erreur
    Ton compilo te dis juste "il y a une erreur mais je ne sais pas quoi ni où" ?

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    non!
    mon compilateur me dis "cannot acces private member..."
    en gros, il ne reconnait pas que mon operateur est friend de la class time!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    Tes protoypes ne sont pas identiques peut etre qu'il "n'effectue" pas le friend sur la bonne fonction.... Fait un copier coller du protoype de ton .cpp dans le .h pour voir, me semble que j'ai deja eu ce style de probleme bizarre.

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    comme tu peux le voir devant toi (mon prog est juste un peu plus haut) les prototypes sont identiques.

    j avais deja fait un copier coller!

    pas autre chose a proposer?

    si j ecris toute la fonction dans la classe ca marche bien!
    je ne sais pas quelle est la difference!!

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Eh bien, pour savoir si c'est en rapport ou non avec l'erreur tu enlèves et tu regardes si le message est le même et au même endroit.

    Ce serait d'ailleurs mieux de donner le message précis et la position.

    Je ne vois pas de problèmes a priori. Deux questions:
    - est-ce que ça se passe de la même façon si tu enlèves le using namespace std et que tu qualifies ce qui doit l'être?
    - est-ce que ça se passe de la même façon si tu renommes time en quelque chose d'autre?

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    J'ai testé en renommant time en Time, et ça fonctionne. En effet, chez moi <iostream> inclu aussi une fonction time_t time(time_t *) hors du namespace std.

    Essaye de renommer ta classe, ou de l'inclure dans un namespace, ça devrait suffire.

    PS : évite d'utiliser un "using namespace" dans un .h

  11. #11
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    le probleme est dans le nom de ta classe, si tu remplaces "time" par autre chose, par exemple "Time" (commencer un nom de classe par une majuscule est d'ailleurs recommande par pas mal de regle de codage), tu n'auras plus de probleme.

    le probleme pose par "time" est que lorsque tu inclus iostream tu declares une fonction "time" definie dans le namespace std mais il y a un using ::time. Ce que je ne comprends pas c'est que la declaration de la classe "time" ne soit pas soit preponderante vu l'utilisation soit refusee si la surcharge lui pose probleme (ce qui ne devrait pas etre le cas).

    En bref g++ perd un peu les pedales
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  12. #12
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    ah, il y a eu telescopage avec Volune, j'ai mis trop de temps a faire "envoye" :-)
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    ostream& operator<<(ostream& out,const time& heure)
    friend ostream& operator<<(ostream&,const time&);

    C'est pas les même

    Je sais que ca ne change rien avec ou sans les noms de variables, mais j'ai deja eu le probleme d'un compilo qui reconnaissait pas la fonction a cause de ca... Essaye ca coute rien.

  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Ce serait d'ailleurs mieux de donner le message précis et la position.
    la position est dans la fonction de l operateur<< a l endroit ou j essaye d utiliser heure.hour, heure.min et heure.sec
    Citation Envoyé par Jean-Marc.Bourguet
    - est-ce que ça se passe de la même façon si tu enlèves le using namespace std et que tu qualifies ce qui doit l'être?.
    comme je l ai dit plus haut, si je ne mais pas le using namespace ca ne fait pas de probleme, mais je ne comprend pas pourquoi,

    n.b j ai mis tout le programme plus haut, si t as 2 min essaye de le compiler et tu verras l erreur!!


    Citation Envoyé par Jean-Marc.Bourguet
    - est-ce que ça se passe de la même façon si tu renommes time en quelque chose d'autre?
    j ai essaye de rennomer time en pensant que ce nom etait deja utilise,
    ca n a pas arrange les choses,

    a part ca, je pense que si le nom etait deja pris, ca aurait fait toutes sorte d erreurs!![/quote]

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    Citation Envoyé par Volune
    PS : évite d'utiliser un "using namespace" dans un .h
    j aimerai bien comprendre stp quelle est le probleme d utiliser un using namespace dans un .h?

    a vrai dire je suis debutant et je ne comprends pas vraiment quel est le but de using namespace!!!!

    si quelqu un peut me donner un lien pour un cours ou un tutoriel su le sujet,
    ca serait sympas!

  16. #16
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    Citation Envoyé par oldfox
    ostream& operator<<(ostream& out,const time& heure)
    friend ostream& operator<<(ostream&,const time&);

    C'est pas les même

    Je sais que ca ne change rien avec ou sans les noms de variables, mais j'ai deja eu le probleme d'un compilo qui reconnaissait pas la fonction a cause de ca... Essaye ca coute rien.
    desole, mais c est tout a fait la meme chose, dans les prototypes on est pas oblige de donner le nom de variables,
    d ailleurs, tu peux voir dans les autre fonctions...

    a part ca, jl ai aussi essaye...

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Au sujet du using namespace dans un .h, ça a été discuté ici:
    http://www.developpez.net/forums/viewtopic.php?t=444328
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Probleme avec les classes friends
    Par Kerwando dans le forum C++
    Réponses: 4
    Dernier message: 27/10/2006, 23h29
  2. Probleme avec operator<
    Par Sokar dans le forum C++
    Réponses: 15
    Dernier message: 05/06/2005, 21h48
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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