surchage << , obligatoirement non membre ?

surchage << , obligatoirement non membre ? - C++ - Programmation

Marsh Posté le 13-01-2009 à 23:19:29    

On ne peut pas déclarer la surcharge de << membre de la classe, c'est obligatoirement friend?
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. class M
  4. {
  5.     friend std::ostream& operator <<(std::ostream&, const M& );
  6. private :
  7.     int I;
  8. };
  9. std::ostream& operator <<(std::ostream& Stream, const M& Obj)
  10. {
  11.     Stream << Obj.I;
  12.     return Stream;
  13. }
  14. M Obj;
  15. std::cout << Obj << std::endl;


 
en faite je comprends pas comment cout.operator <<(M &o) réussit à appeler la bonne fonction....


Message édité par frenchtoucco le 13-01-2009 à 23:21:05

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 13-01-2009 à 23:19:29   

Reply

Marsh Posté le 14-01-2009 à 00:49:34    

C'est la magie du Koenig Lookup (argument-dependant lookup).
 
Ca n'est pas obligatoirement friend, il suffit d'avoir par exemple une fonction membre void print(ostream& ) const, et à ce moment là, la fonction libre << devient triviale à écrire.

Reply

Marsh Posté le 14-01-2009 à 01:21:19    

a ok, il suffit juste que  
 
d::ostream& operator <<(std::ostream& Stream, const M& Obj)
{
    Stream << Obj.I;
    return Stream;
}
 
soit définit dans le même namespace que l'argument et ça marche.
 
D'aileurs dans le cas d'un programme bateau : un main, une classe et la fonction << adéquate, ces 3 parties sont définies dans quel namespace, ça porte un nom ?


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 14-01-2009 à 11:37:46    

C'est la portée globale, ::

Reply

Marsh Posté le 14-01-2009 à 16:12:48    

en général, il est pas friend et il appelle un methode pritn ou approchant pr des histoires de virtualités

Reply

Sujets relatifs:

Leave a Replay

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