Overlord operator <<, aide svp

Overlord operator <<, aide svp - C++ - Programmation

Marsh Posté le 18-09-2003 à 09:56:52    

:hello:  
 
Ma template a pour but de simuler une team queue,j ai defini une fonction display pour affiche cette meme team :

Code :
  1. template <class I, class T>
  2. void team_queue<I,T>::display()
  3. {
  4. bla bla
  5. }


sa marche bien, masi a la place je voudrai definir l operateur <<  
a la place de display.
 
C'est mieux de faire cout << myteamq; que myteamq.display();
comment faire sa pour dans mon cas  ?
 
merci.
 
 [:alarmclock119]  
 

Reply

Marsh Posté le 18-09-2003 à 09:56:52   

Reply

Marsh Posté le 18-09-2003 à 10:15:36    

Tu pourras trouver un début de réponse dans cet article (et tous les articles du même auteur traîtant du sujet)


---------------
each day I don't die is cheating
Reply

Marsh Posté le 18-09-2003 à 10:17:57    

La forme classique de surcharge de l'operateur <<:

Code :
  1. class Maclasse
  2. {
  3.     public:
  4.          friend ostream & operator<<(ostream &stream,const Maclasse&obj);
  5. }


---------------
Le Tyran
Reply

Marsh Posté le 18-09-2003 à 11:22:20    

titre : Overlord operator <<, aide svp
 
 
t'as produit trop de zerglings et maintenant t baisé fo faire plein d'overlords.....

Reply

Marsh Posté le 18-09-2003 à 11:22:42    

LetoII a écrit :

La forme classique de surcharge de l'operateur <<:

Code :
  1. class Maclasse
  2. {
  3.     public:
  4.          friend ostream & operator<<(ostream &stream,const Maclasse&obj);
  5. }



:non: friend est a utilisé quand on ne peut pas faire autrement

Reply

Marsh Posté le 18-09-2003 à 11:26:13    

farib a écrit :

titre : Overlord operator <<, aide svp
 
 
t'as produit trop de zerglings et maintenant t baisé fo faire plein d'overlords.....


 [:alarmclock119]  
arf overload

Reply

Marsh Posté le 18-09-2003 à 11:34:28    

Taz a écrit :

:non: friend est a utilisé quand on ne peut pas faire autrement


 
Voyons voir, si je veux que mon operateur externe est accés à toutes les données membre de mon objet j'ai pas trop le choix [:meganne]


---------------
Le Tyran
Reply

Marsh Posté le 18-09-2003 à 11:37:29    

xiluoc a écrit :


 [:alarmclock119]  
arf overload  


Tu peux aussi essayer de parler français, c'est francophone ici...et avec surcharge c'est plus dur de trouver une connerie à écrire... [:ddr555]

Reply

Marsh Posté le 18-09-2003 à 11:39:51    

skeye a écrit :


Tu peux aussi essayer de parler français, c'est francophone ici...et avec surcharge c'est plus dur de trouver une connerie à écrire... [:ddr555]  


 
Sucage?  [:ddr555]  
 
 
[:dehors2]


---------------
Le Tyran
Reply

Marsh Posté le 18-09-2003 à 11:39:57    

LetoII a écrit :


 
Voyons voir, si je veux que mon operateur externe est accés à toutes les données membre de mon objet j'ai pas trop le choix [:meganne]


 
Hmmm, tu as fait une belle classe avec des set/get, t'as pas besoin de friend :o

Reply

Marsh Posté le 18-09-2003 à 11:39:57   

Reply

Marsh Posté le 18-09-2003 à 11:41:57    

Joel F a écrit :


 
Hmmm, tu as fait une belle classe avec des set/get, t'as pas besoin de friend :o


 
 :sarcastic: je vais me faire chier à appeler getMachin() alors que je peux directement faire machin, voyons [:meganne]


---------------
Le Tyran
Reply

Marsh Posté le 18-09-2003 à 11:46:33    

pourquoi sa marche toujours pas ?
 
 
ma template.h

Code :
  1. template <class I, class T> // item_type   team_type
  2. class team_queue
  3. {
  4.     public :
  5.        
  6.         struct teamq_struct
  7.         {
  8.                 vector <I> vect_item;
  9.                 T item_team;
  10.         };
  11.        
  12.         team_queue();
  13.         //default constructor
  14.        
  15.         ~team_queue();
  16.         //default destructor
  17.        
  18.         ostream& operator <<(ostream& stream,const team_queue& teamq);
  19.         //overloading operator << which call the fonction display
  20.        
  21.        
  22.         void push (I item,T team);
  23.         ///adds the supplied item belonging to the given team number
  24.         // to the team_queue in the apporpriate fashion
  25.      
  26.         void pop();
  27.         //removes the front from the team_queue
  28. .
  29. .
  30. .
  31. ect


 
 
ensuite les fonctions

Code :
  1. .
  2. .
  3. .
  4. /*
  5. |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
  6. DISPLAY : display all the elements of the team queue
  7. |______________________________________________________|
  8. */
  9. template <class I, class T>
  10. ostream& operator team_queue<I,T>::<<(ostream& stream,const team_queue<I,T>& teamq);
  11. {
  12. teamq.display();
  13. }
  14. template <class I, class T>
  15. void team_queue<I,T>::display()
  16. {
  17.      if (isempty()) error(1);
  18.      else
  19.      {
  20.           for (cursor = struct_vect.begin(); cursor != struct_vect.end(); cursor++)
  21.           for (int i =0; i < cursor->vect_item.size();i++)  cout << " (" <<  cursor->vect_item[i] << "," <<  cursor->item_team << " ) " << flush;
  22.           cout << endl;
  23.      }
  24. .
  25. .
  26. .


 
dans le main
 

Code :
  1. cout << mytq;


 
28 H:\PROGRAMMATION\C++\=[PROJETS]=\COMP 125\A3\main.cpp
no match for `std::ostream& << team_queue<std::string, int>&'  
 :sweat:

Reply

Marsh Posté le 18-09-2003 à 11:52:20    

LetoII a écrit :

La forme classique de surcharge de l'operateur <<:

Code :
  1. class Maclasse
  2. {
  3.     public:
  4.          friend ostream & operator<<(ostream &stream,const Maclasse&obj);
  5. }




Bon, c'est vrai que le friend n'est pas indispensable (mais pas choquant non plus).
Mais il y a autre chose que je changerais :

Code :
  1. class Maclasse
  2. {
  3. public:
  4.   template<typename _E, typename _Tr>
  5.   /*friend*/ std::basic_ostream<_E,_Tr>& operator<<( std::basic_ostream<_E, _Tr> &os, const Maclasse& time );
  6. }


En effet, l'utilisateur peut vouloir "envoyer" sa classe dans des streams qui ne sont pas de type ostream (wcout par exemple).


---------------
each day I don't die is cheating
Reply

Marsh Posté le 18-09-2003 à 11:54:31    

Code :
  1. template <class I, class T>
  2. ostream& operator team_queue<I,T>::<<(ostream& stream,const team_queue<I,T>& teamq);
  3. {
  4. teamq.display();
  5. }

???
 
c'est pas :

Code :
  1. template <class I, class T>
  2. ostream& team_queue<I,T>::operator<<(ostream& stream,const team_queue<I,T>& teamq);
  3. {
  4. teamq.display();
  5. }

plutot ?

Reply

Marsh Posté le 18-09-2003 à 11:56:21    

gatorette a écrit :


Bon, c'est vrai que le friend n'est pas indispensable (mais pas choquant non plus).
Mais il y a autre chose que je changerais :

Code :
  1. class Maclasse
  2. {
  3. public:
  4.   template<typename _E, typename _Tr>
  5.   /*friend*/ std::basic_ostream<_E,_Tr>& operator<<( std::basic_ostream<_E, _Tr> &os, const Maclasse& time );
  6. }


En effet, l'utilisateur peut vouloir "envoyer" sa classe dans des streams qui ne sont pas de type ostream (wcout par exemple).


 
Certe, mais bon vu qu'il s'en sort pas avec un truc simple on va pas tout  de suite rentrer dasn les subtilités  :o


---------------
Le Tyran
Reply

Marsh Posté le 18-09-2003 à 11:57:34    

LetoII a écrit :


 
Certe, mais bon vu qu'il s'en sort pas avec un truc simple on va pas tout  de suite rentrer dasn les subtilités  :o  


sa serai sympa  :whistle:  
1) c est ma premiere template
2) premiere "surcharge" (non ponderal)

Reply

Marsh Posté le 18-09-2003 à 11:57:44    

LetoII a écrit :


 
 :sarcastic: je vais me faire chier à appeler getMachin() alors que je peux directement faire machin, voyons [:meganne]


 
ouais enfin a ce compte la balance tout en public et basta hein ?

Reply

Marsh Posté le 18-09-2003 à 11:57:48    

z'etes teubé
 
template<typename T>
inline ostream & operator<<(ostream &os, const machin<T> &m)
{
  os << m.print();  
  return os;
}
 
en général, on ne déclare pas les opérateurs binaires (sauf exception) en fonction membre ou friend.
 
on voit souvent
 
ostream & operator<< (ostream &os, const truc &t)
{
  t.print(os);
  return os;
}
 

Reply

Marsh Posté le 18-09-2003 à 11:57:49    

xiluoc a écrit :

pourquoi sa marche toujours pas ?
 

Code :
  1. template <class I, class T> // item_type   team_type
  2. class team_queue
  3. {
  4.     public :
  5.        
  6.         struct teamq_struct
  7.         {
  8.                 vector <I> vect_item;
  9.                 T item_team;
  10.         };
  11.        
  12.         team_queue();
  13.         //default constructor
  14.        
  15.         ~team_queue();
  16.         //default destructor
  17.        
  18.         template <class I, class T> // A rajouter je pense
  19.         ostream& operator <<(ostream& stream,const team_queue<I,T>& teamq);
  20.         //overloading operator << which call the fonction display
  21.        
  22.        
  23.         void push (I item,T team);
  24.         ///adds the supplied item belonging to the given team number
  25.         // to the team_queue in the apporpriate fashion
  26.      
  27.         void pop();
  28.         //removes the front from the team_queue
  29. .
  30. .
  31. .
  32. ect


 
 
ensuite les fonctions

Code :
  1. .
  2. .
  3. .
  4. /*
  5. |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
  6. DISPLAY : display all the elements of the team queue
  7. |______________________________________________________|
  8. */
  9. template <class I, class T>
  10. ostream& operator team_queue<I,T>::<<(ostream& stream,const team_queue<I,T>& teamq);
  11. {
  12. teamq.display(stream);
  13. return stream; // il faut retourner le stream!
  14. }
  15. template <class I, class T>
  16. void team_queue<I,T>::display(ostream& stream) // il faut sortir dans le stream et pas dans cout!
  17. {
  18.      if (isempty()) error(1);
  19.      else
  20.      {
  21.           for (cursor = struct_vect.begin(); cursor != struct_vect.end(); cursor++)
  22.           for (int i =0; i < cursor->vect_item.size();i++)  stream << " (" <<  cursor->vect_item[i] << "," <<  cursor->item_team << " ) " << flush;
  23.           stream << endl;
  24.      }
  25. }


 


 
Je ne trouve vraiment pas ça très élégant. Va voir les liens que j'ai donné au-dessus...


---------------
each day I don't die is cheating
Reply

Marsh Posté le 18-09-2003 à 12:13:49    

Code :
  1. #include <iostream>
  2. #include <typeinfo>
  3. template<typename T>
  4. class Foo
  5. {
  6. public:
  7.   void print(std::ostream &os) const
  8.   {
  9.     os << typeid(*this).name() << std::endl;
  10.   }
  11. };
  12. template<typename T>
  13. std::ostream& operator<<(std::ostream &os, const Foo<T> &f)
  14. {
  15.   f.print(os);
  16.   return os;
  17. }
  18. int main()
  19. {
  20.   Foo<int> fi;
  21.   std::cout << fi;
  22. }

Reply

Marsh Posté le 18-09-2003 à 12:17:09    

:whistle:


Message édité par xiluoc le 18-09-2003 à 12:23:14
Reply

Marsh Posté le 18-09-2003 à 12:18:26    

rien à foutre

Reply

Marsh Posté le 18-09-2003 à 12:23:09    

xiluoc a écrit :

Full source
 
...
 


Merci mais j'ai deja du PQ

Reply

Marsh Posté le 18-09-2003 à 12:23:57    

chrisbk a écrit :


Merci mais j'ai deja du PQ


 :kaola:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed