Overloading operatore di inserimento

di il
4 risposte

Overloading operatore di inserimento

Ciao a tutti/e, ho cercato parecchio in internet ma non riesco a trovare qualcuno che mi spieghi perché l'overloading dell'operatore di inserimento (<<) deve essere dichiarato friend (anziché far parte della classe come gli overload degli altri operatori)...

4 Risposte

  • Re: Overloading operatore di inserimento

    In realtà no, è una questione di RHS e LHS

    Rammenta che qualcosa==qualcos'altro non sempre è identico a qualcos'altro==qualcosa
    Benvenuto nel magico mondo del C++

    PS è essenzialmente inutile quando non dannoso ridefinire gli operatori, è solo zucchero sintattico
  • Re: Overloading operatore di inserimento

    Puoi anche non dichiararla friend, può anche essere una semplice funzione esterna che riesca ad accedere ai campi dell'oggetto messo come secondo argomento (attraverso per esempio un getter) per poterli stampare.
    
    #include <iostream>
    using namespace std;
    class Complex {
      private:
        int real;
        int img;
      public:
        Complex(int r=0,int i=0) {
          real=r;
          img=i;
        }
        int getReal() {
          return real;
        }
        int getImg() {
          return img;
        }
    };
    ostream & operator<<(ostream &out,Complex &c) {
      out<<c.getReal()<<"+i"<<c.getImg()<<endl;
      return out;
    }
    int main() {
      Complex c(10,5);
      cout<<c<<endl;
    }
    
    Non puoi invece metterla come funzione membro di una classe, perché la funzione deve essere chiamata su un oggetto di tipo ostream, mentre invece se la metti dentro dovresti chiamarla su un oggetto di quella classe che non avrebbe senso.
  • Re: Overloading operatore di inserimento

    +m2+ ha scritto:


    In realtà no, è una questione di RHS e LHS

    Rammenta che qualcosa==qualcos'altro non sempre è identico a qualcos'altro==qualcosa
    mi potresti fare un esempio?
  • Re: Overloading operatore di inserimento

    darknight_03 ha scritto:


    Non puoi invece metterla come funzione membro di una classe, perché la funzione deve essere chiamata su un oggetto di tipo ostream, mentre invece se la metti dentro dovresti chiamarla su un oggetto di quella classe che non avrebbe senso.
    ok, adesso si che mi è tutto più chiaro, grazie!
Devi accedere o registrarti per scrivere nel forum
4 risposte