Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3197 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  overload <<, probleme :/

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

overload <<, probleme :/

n°671980
xiluoc
un pc pour les unirs ....
Posté le 12-03-2004 à 15:30:22  profilanswer
 

:hello: , dans le bouquin j ai ca :

Code :
  1. ostream& operator<<(ostream &out, const classname &var)


 
j ai une template de cette forme :

Code :
  1. #ifndef CIRCLET_H
  2. #define CIRCLET_H
  3. using namespace std;
  4. template <class T>
  5. class circle{
  6.   public:
  7.     circle();     
  8.     circle(const circle<T> & c);             
  9.     ect ect ...
  10.     ostream& operator <<(ostream &out, const  circle<T> &c);
  11.   private:
  12.    .......
  13. };
  14. template <class T>
  15. circle<T>::circle():length(0), ring(NULL) { }
  16. template <class T>
  17. ostream& operator<<(ostream &out, const  circle &c)
  18. {
  19. out << "test";
  20. //c.printCircle();
  21. return out;
  22. }


 
a la compilation j ai ce message d erreur :
 

Code :
  1. In file included from josept.cc:10:
  2. circlet.h:51: error: `std::ostream& circle<T>::operator<<(std::ostream&, const
  3.    circle<T>& )' must take exactly one argument
  4. circlet.h: In instantiation of `circle<std::string>':
  5. josept.cc:16:   instantiated from here
  6. circlet.h:51: error: `std::ostream& circle<T>::operator<<(std::ostream&, const
  7.    circle<T>& ) [with T = std::string]' must take exactly one argument
  8. zsh: exit 1     g++ -o josept.out josept.cc


 
il me parle du programme josept qui creer l objet, circle<string> c;
heu .. je comprend pas d ou viens le pb ?
merci,


Message édité par xiluoc le 12-03-2004 à 15:31:42
mood
Publicité
Posté le 12-03-2004 à 15:30:22  profilanswer
 

n°671986
Kristoph
Posté le 12-03-2004 à 15:35:48  profilanswer
 

L'"operator <<" et l'"operator >>" ne peuvent pas être des fonctions membres de classe parceque le premier paramètre doit être un istream/ostream et qu'il ne t'est pas possible d'ajouter des fonctions membres dans ces classes ( pas proprement en tout cas :) )

n°672387
xiluoc
un pc pour les unirs ....
Posté le 12-03-2004 à 21:43:44  profilanswer
 

Comment je dois faire alors ?
c est la qu intervient les class friends non ?

n°672392
Taz
bisounours-codeur
Posté le 12-03-2004 à 21:48:28  profilanswer
 

oui et non. si tu peux t'en passer cai mieux, cai en dernier recours
 
le problème des friends, c'est que c'est des passe-droit. et j'aime assez peu que des opérations comme la comparaison ou l'affichage soit planquées derrière un friend, comme si ces opérations publiques devaient reposer sur des données cachées : si je n'ai pas le droit de savoir ce qui est affiché et sur quoi est basé la comparaison, j'aime assez peu. mais c'est personnel comme point de vue

n°672404
xiluoc
un pc pour les unirs ....
Posté le 12-03-2004 à 22:01:32  profilanswer
 

qu elle solution me rest il alors ? vu que la sa marche pas .. :/

n°672413
Taz
bisounours-codeur
Posté le 12-03-2004 à 22:07:13  profilanswer
 

faire un joli Iterator et voilà, puis faire une fonction externe qui affiche comme tu veux

n°672418
xiluoc
un pc pour les unirs ....
Posté le 12-03-2004 à 22:12:32  profilanswer
 

hum sa me complique la tache je n ai jamais fais d iterator, je vais essayer ..

n°672423
Taz
bisounours-codeur
Posté le 12-03-2004 à 22:15:13  profilanswer
 

enfin, du moins, vois comment tu fais pour afficher un tableau : tu affiches chaque élément auxquels tu as acces. défini une façon d'avoir accès à tes éléments, et affiche les

n°674900
frenchkiss
Posté le 16-03-2004 à 11:53:16  profilanswer
 

>défini une façon d'avoir accès à tes éléments, et affiche les
 
et paf tu petes l'encapsulation ,
d'ou le friend..

n°675776
xiluoc
un pc pour les unirs ....
Posté le 17-03-2004 à 04:43:37  profilanswer
 

meme en mettant friend devant ma fonction le message d erreur reste le meme :/

mood
Publicité
Posté le 17-03-2004 à 04:43:37  profilanswer
 

n°675820
Joel F
Real men use unique_ptr
Posté le 17-03-2004 à 09:11:08  profilanswer
 

frenchkiss a écrit :

>défini une façon d'avoir accès à tes éléments, et affiche les
 
et paf tu petes l'encapsulation ,
d'ou le friend..


 
euh non  :heink:  
 

Code :
  1. template<class T>
  2. class MonConteneur
  3. {
  4.   public :
  5.   // pleisn de truc
  6.   T getValue( ) { return data; }
  7.   private :
  8. // plein de truc
  9. T data;
  10. };
  11. template<class T>
  12. ostream& operator<< ( ostream & os, const MonConteneur<T>& c )
  13. {
  14.    os << c. getValue();
  15.    return os;
  16. }


 
c'ets propre, respecte l'encapsulation et evite le friend.
Evidemment la classe est purement bateau.


Message édité par Joel F le 17-03-2004 à 09:12:02
n°675927
frenchkiss
Posté le 17-03-2004 à 10:35:31  profilanswer
 

...
ouai ton getValue rentoure T
puis tu fais un os << T  
bravo!!!
tu m expliques ce que t as resolu la?
..a part rajouter une couche
 
 
>euh non
ben si , si ta logique c est de dire "je peux afficher que ce que je peux acceder" cf:
>comme si ces opérations publiques devaient reposer sur des >données cachées : si je n'ai pas le droit de savoir ce qui est >affiché et sur quoi est basé la comparaison, j'aime assez peu
 
 
alors ca veut dire que tu vas devoir mettre des accesseurs public pour tes donnees private, et ainsi permettre a n importe qui de visualiser ces donnees. si ca c 'est pas violer l encapsulation.
Je peux comprendre la reticence que vous avez a utiliser friend.
puisque c'est un mecanisme puissant qui si mal utilise permet de faire a peu pres n importe quoi.
c'est la raison pour laquelle il faut l'utiliser au bon moment. la surchage de l operatuer en fait parti a mon avis.
 
 
et si on prends un exemple:
voiture et garagiste
le garagiste pourrait tres bien etre un friend de la voiture sur certainnes de ces methodes getmotor() par exemple
l avantage c est aue le moteur n est accessible qu'au garagiste et que le conducteur par exmple n'aurai pas le droit d y toucher.
 
donc le friend dans ce cas permet au contraire de renforcer l'encapsulation en evitant de mettre un accesseur publique qui ne serve qu'au garagiste ( et je parle meme pas du replaceMotor par exemple)
 
fk
 

n°676041
xiluoc
un pc pour les unirs ....
Posté le 17-03-2004 à 12:19:48  profilanswer
 

en meme temp mon pb est toujours la, sa serait bien de donner des examples se basant sur ma template ;)

n°676096
Joel F
Real men use unique_ptr
Posté le 17-03-2004 à 13:23:54  profilanswer
 

frenchkiss a écrit :


alors ca veut dire que tu vas devoir mettre des accesseurs public pour tes donnees private, et ainsi permettre a n importe qui de visualiser ces donnees. si ca c 'est pas violer l encapsulation.


 
ben non.
 
@xiluoc :
tu peut te faire une methode print() publique de ton cercle qui prend en param un ostream
et surchargé ostream pour appeler print. je vois que ca pour eviter le friend.


Message édité par Joel F le 17-03-2004 à 13:30:27
n°676105
xiluoc
un pc pour les unirs ....
Posté le 17-03-2004 à 13:35:01  profilanswer
 

mais pour linstant c est aps trop grave d eviter le friend ou non tout ce qeu j eveus c est que ca marche, ensuite j essaieria sans le friend
 

Code :
  1. template <class T>
  2. friend ostream& operator<<(ostream &out, const  circle &c)
  3.   {
  4.      out << "test";
  5.      //c.printCircle();
  6.      return out;
  7.   }


 
retourn la meme erreur

n°676106
Joel F
Real men use unique_ptr
Posté le 17-03-2004 à 13:35:05  profilanswer
 

frenchkiss a écrit :


donc le friend dans ce cas permet au contraire de renforcer l'encapsulation


 
bon alors au temps pour moi :
http://www.gotw.ca/gotw/070.htm
 
bref, friend sur ostream ca passe. malheureusement pour lui ici, le friend template va avoir du mal à passer.

n°676110
Joel F
Real men use unique_ptr
Posté le 17-03-2004 à 13:39:07  profilanswer
 

xiluoc a écrit :

mais pour linstant c est aps trop grave d eviter le friend ou non tout ce qeu j eveus c est que ca marche, ensuite j essaieria sans le friend


Essaye :
 

Code :
  1. #ifndef CIRCLET_H
  2. #define CIRCLET_H
  3. using namespace std;
  4. template <class T>  
  5. class circle{
  6.  public:
  7.   circle();        
  8.   circle(const circle<T> & c);              
  9.   ect ect ...
  10.  
  11.   friend ostream& operator << <T> (ostream &out, const  circle<T> &c);
  12.  private:
  13.  .......
  14. };
  15. template <class T>
  16. circle<T>::circle():length(0), ring(NULL) { }
  17. template <class T>
  18. ostream& perator<<(ostream &out, const  circle<T> &c)
  19. {
  20.      out << "test";
  21.      //c.printCircle();
  22.      return out;
  23. }


 
Le modificateur friend ne marche que sur des classes ou fonctions.
OR ici tu l'affecte à une fonction template, un MODELE, il faut donc l'insatncier pour permettre de lui affecter le modificateur friend.
 
je suis pas super clair mais l'idée c'est ca.
 
tested & approved gcc 3.3
 
@frenchkiss : on pensait la même chose mais j'avais pas compris, mille excuses si je me susi emporté :jap:


Message édité par Joel F le 17-03-2004 à 13:42:23
n°676118
xiluoc
un pc pour les unirs ....
Posté le 17-03-2004 à 13:46:32  profilanswer
 

super merci !  

n°676141
Joel F
Real men use unique_ptr
Posté le 17-03-2004 à 13:57:42  profilanswer
 

ca marche ??

n°676147
xiluoc
un pc pour les unirs ....
Posté le 17-03-2004 à 13:59:37  profilanswer
 

heu je testerai demain en reboutant sous linux.
j y crois en tous cas =)

n°676158
Joel F
Real men use unique_ptr
Posté le 17-03-2004 à 14:05:10  profilanswer
 

^^ ok

n°676259
frenchkiss
Posté le 17-03-2004 à 14:40:10  profilanswer
 

2 soluces  
 
no problemo joel ;)
 
   
  using namespace std;  
 
  class printable  
  {
   //private :)
  virtual ostream print(ostream& out) const = 0;
  public:
 friend ostream& operator << (ostream &out, const printable &c);  
  };
 
  ostream& operator << (ostream &out, const printable &c)
 {
   c.print(out);
   return out;
 }
 
   
  template <class T>  
 class circle : public printable {
      public:  
    circle (T e) ;      
      private:  
    ostream print(ostream& out) const{
     out<<bla;
    return out;
    }
    circle(const circle<T> & c) {};
    T bla;
   
     
  };  
   
   
  template <class T>  
   circle<T>::circle (T e): bla(e){ }  
 
 
    template <class T>  
 class square {
      public:  
    square (T e) ;      
   friend ostream& operator << (ostream &out, const square & sq);
      private:  
    ostream& print(ostream& out) const{
     out<<bla;
    return out;
    }
    square(const circle<T> & c) {};
    T bla;
   
     
  };  
   
   
  template <class T>  
   square<T>::square (T e): bla(e){ }  
 
  template <class T>  
ostream& operator << (ostream &out, const square<T> & sq)
{
 sq.print(out);
 return out;
}
 
   
 
int main(int argc, char* argv[])
{
 string st("gegege" );
  circle<string> moncircle( st );    
  cout << moncircle;
  square<string> monsqaure(st);
  cout<<endl<<monsqaure;
 return 0;
}
 

n°676736
xiluoc
un pc pour les unirs ....
Posté le 18-03-2004 à 01:24:07  profilanswer
 

sa marche =))

n°676739
xiluoc
un pc pour les unirs ....
Posté le 18-03-2004 à 01:32:34  profilanswer
 

ca compile bien  
 

Code :
  1. template <class T>
  2. ostream& operator<<(ostream &out, const  circle<T> &c)
  3. {
  4. //      out << "wewee";
  5. out <<  c.printCircle();
  6. return out;
  7. //      return out;
  8. }


 
mais quand je fais cout << c; (c etant mon obket circle)
y a desmessages d erreur
 
je dois passer les mauvasi paramtres, ce st as comem ca qu on utlise lo verload <<?

n°676742
Taz
bisounours-codeur
Posté le 18-03-2004 à 01:40:08  profilanswer
 

return c.print(out);

n°676744
Taz
bisounours-codeur
Posté le 18-03-2004 à 01:41:59  profilanswer
 

enfin bon tout ça c'est très crade, très crade. manque des virtual dans tous les sens, et puis quand on fait des template comme ça, ça sert à rien.
 
débarrase toi de la classe abstraite Java-isante, elle sert à rien

n°676757
xiluoc
un pc pour les unirs ....
Posté le 18-03-2004 à 07:21:50  profilanswer
 

Code :
  1. circle <string> c;
  2. c.insert("haha" );
  3. c.insert("hehe" );
  4. c.insert("hoho" );
  5. cout << c;


 
erreur
 

Code :
  1. circlet.h: In function `std::ostream& operator<<(std::ostream&, const
  2.    circle<T>& ) [with T = std::string]':
  3. josept.cc:22:   instantiated from here
  4. circlet.h:176: no matching function for call to `circle<std::string>::
  5.    printCircle(std::basic_ostream<char, std::char_traits<char> >& ) const'
  6. circlet.h:162: candidates are: void circle<T>::printCircle() [with T =
  7.    std::string]

n°676758
xiluoc
un pc pour les unirs ....
Posté le 18-03-2004 à 07:29:42  profilanswer
 

apperemtn sa viens d ema fonction print
 

Code :
  1. template <class T>
  2. void circle<T>::printCircle()
  3. {
  4. if (length==0) return;
  5. for (int i=0; i<length; i++)
  6. {
  7.  cout << ring->num << "\t";
  8.  ring=ring->next;
  9. }
  10. cout << endl;
  11. }

n°676895
frenchkiss
Posté le 18-03-2004 à 10:49:03  profilanswer
 

regarde comment est defini la fonction print de la classe square
ci dessus.
 
pis ton message d erruer est qd meme assez explicite , ca tu devrait le trouver tout seul hein.
 
tu fais un cout  << c
avec  
[c++]
template <class T>  
  ostream& operator<<(ostream &out, const  circle<T> &c)  
  {  
    //      out << "wewee";  
    out <<  c.printCircle();  
    return out;  
    //      return out;  
  }  
[/c++]
 
ton print circle tu crois qu'il fait quoi???
 
essaie de bien comprendre ce qu'il se passe ; et lis les messages d erreur ;)
 
[taz] exact il manque un vitual sur le print de square ( si on considere que l 'on va la deriver..)
 
( square et circle sont 2 solutions distinctes dans mon post hein)
 
FK

n°676896
frenchkiss
Posté le 18-03-2004 à 10:49:30  profilanswer
 

zut c pas ca les tag c++ , decidement :lol

n°676897
Joel F
Real men use unique_ptr
Posté le 18-03-2004 à 10:53:20  profilanswer
 

c [ cpp ] sans espace et [ /cpp ]

n°676900
frenchkiss
Posté le 18-03-2004 à 10:58:41  profilanswer
 

Code :
  1. while (true)
  2. cout <<" merci Joel F"<<endl;


Message édité par frenchkiss le 18-03-2004 à 10:59:01
n°676977
xiluoc
un pc pour les unirs ....
Posté le 18-03-2004 à 12:08:57  profilanswer
 

hum

Code :
  1. ostream& print(ostream& out) const{
  2.     out<<bla;
  3.     return out;
  4.     }


 
 
 

Code :
  1. ostream& operator << (ostream &out, const square<T> & sq)
  2. {
  3. sq.print(out);
  4. return out;
  5. }


 
je dois donc faire
 

Code :
  1. template <class T>
  2. ostream& circle<T>::printCircle(ostream& circle_out)
  3. {
  4. if (length==0) return;
  5. for (int i=0; i<length; i++) 
  6. {
  7. circle_out << ring->num << "\t";
  8. ring=ring->next;
  9. }
  10. circle_out << endl;
  11. }


    [:dams86]  

n°676983
Taz
bisounours-codeur
Posté le 18-03-2004 à 12:12:25  profilanswer
 

endl bordel :o

n°677677
xiluoc
un pc pour les unirs ....
Posté le 19-03-2004 à 01:41:48  profilanswer
 

heu... j y suis presque

Code :
  1. ostream& printCircle(ostream& out); 
  2. friend ostream& operator << <T> (ostream &out, const  circle<T>  &c);


 
 

Code :
  1. template <class T>
  2. ostream& circle<T>::printCircle (ostream& out)
  3. {
  4. if (length==0) out << " ";
  5. for (int i=0; i<length; i++)
  6. {
  7.  out << ring->num << "\t";
  8.  ring=ring->next;
  9. }
  10. }
  11. template <class T>
  12. ostream& operator<<(ostream &out, const  circle<T> &c)
  13. {
  14. return c.printCircle(out);
  15. }


 
ca al air bon pourtant.
 
masi j obtiens ca :
 

Code :
  1. circlet.h: In function `std::ostream& operator<<(std::ostream&, const
  2.    circle<T>& ) [with T = std::string]':
  3. josept.cc:22:   instantiated from here
  4. circlet.h:177: passing `const circle<std::string>' as `this' argument of `
  5.    std::ostream& circle<T>::printCircle(std::ostream& ) [with T = std::string]'
  6.    discards qualifiers


 
:/

n°677692
Taz
bisounours-codeur
Posté le 19-03-2004 à 07:49:54  profilanswer
 

1) il sert à quoi le friend ?
2) il te manque des const

n°678586
xiluoc
un pc pour les unirs ....
Posté le 20-03-2004 à 08:23:35  profilanswer
 

le friend me sert accesder aux variables private.
 
j y arrive pas.
et je comprend pas le code example donne plus haut.
 

Code :
  1. using namespace std; 
  2.   class printable 
  3.   {
  4.    //private   
  5.   virtual ostream print(ostream& out) const = 0;
  6.  
  7.   //pourquoi const=0 ?
  8.   public:
  9.   friend ostream& operator << (ostream &out, const printable &c); 
  10.   };
  11.   //la on met pas template<class T> ? ni de circle<T>:: pour quoi ?
  12.   ostream& operator << (ostream &out, const printable &c)
  13. {
  14.    c.print(out);
  15.    return out;
  16. }
  17.  
  18.   template <class T> 
  19.   class circle : public printable {
  20.       public
  21.     circle (T e) ;     
  22.       private
  23.     ostream print(ostream& out) const{
  24.      out<<bla;
  25.     return out;
  26.     }
  27.     circle(const circle<T> & c) {};
  28.     T bla;
  29.  
  30.    
  31.   }; 
  32.  
  33.  
  34.   template <class T> 
  35.    circle<T>::circle (T e): bla(e){ }


 
et le reste encore moins.
 
Pour voir mon code en entier :
http://coulix-new.ozforces.com.au/circlet.h
http://coulix-new.ozforces.com.au/josept.cc
c est quand meme assez tordu la syntax tempalte :/


Message édité par xiluoc le 20-03-2004 à 08:24:33
n°678587
Joel F
Real men use unique_ptr
Posté le 20-03-2004 à 08:39:56  profilanswer
 

je t'ai donné la solution bourdel ... et t'as pas besoin de cette classe printable :x

n°678591
xiluoc
un pc pour les unirs ....
Posté le 20-03-2004 à 08:46:25  profilanswer
 

ben, tas solution marhce bien pour le <<
masi c est la fonction ostream& print circle que j arrive pas a  
faire marcher.

n°678645
Joel F
Real men use unique_ptr
Posté le 20-03-2004 à 11:45:04  profilanswer
 

tu n'en as pas B.E.S.O.I.N ...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  overload <<, probleme :/

 

Sujets relatifs
CVI probleme d'utilisation des API windowsJe réalise un petit jeu et j'ai un problème de focus avec l'applet
[PHP Mysql] probleme pour avoir la difference entre 2 dates.[PHP] Problème de codage de texte?
Problème métaphysique ?Problème sur VBA
Problème d'allocation d'un tableau dans une fonction[VB Excel] probleme dans textBox [RESOLU]
[ASM GNU x86] Problème de segmentation fault [Résolu]Problème avec les Fonctions d'images comme getimagesize()
Plus de sujets relatifs à : overload <<, probleme :/


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR