Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    98

    [C++] Overload operatore <<

    Buonasera,

    avevo un altro dubbio (che credo sia abbastanza rapido)..

    Sto definendo una classe che mi modella un oggetto persona, solo che ho la necessità di ridefinire l'operatore << per fare in modo di ritornare una stringa che contenga il nome della persona con a fianco l'età (che sono due variabili private della classe)

    Qualcosa del tipo:
    codice:
    string& Persona::operator<<(string& s)
    {
    	s = this->nome+" "+this->eta+" "+s;
    	return s;
    }
    Solo che in C++ non c'è una conversione implicita da intero a stringa.. considerando che sarebbe meglio non usare itoa e che non posso usare:
    string eta;
    eta << this->eta;
    eta.str();

    visto che g++ mi dice che non trova l'operatore<<:
    "error: no match for ‘operator<<’ in ‘eta << ((Persona*)this)->Persona::eta’"
    Ho importato le seguenti librerie:
    #include <iostream>
    #include <string>
    #include <sstream>

    using namespace std;

    Il fatto è che g++ non mi va a cercare l'operatore << in std ma nella stessa classe.. come posso fare? Grazie

  2. #2
    Normalmente non si usa l'operatore << sulle stringhe, ma sugli stream, per cui il tuo operator<< dovrebbe essere:
    codice:
    std::ostream & Persona::operator<<(std::ostream & os)
    {
        return os<<nome<<" "<<eta<<" ";
    }
    Sarà poi il chiamante ad usarlo eventualmente su uno stringstream per ricavarne una stringa:
    codice:
    std::ostringstream os;
    Persona p;
    // ...
    os<<p;
    std::string s=os.str();
    (per l'ostringstream vedi qui)
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ah tra l'altro nel copia-incolla mi era sfuggito un passaggio fondamentale... non puoi definire operator<< come membro della classe, dato che il primo operando di << è lo stream, e non la tua classe (in altre parole: negli operatori ridefiniti come membri della classe, il primo operando è *this, e quindi necessariamente ha il tipo della classe).

    Ergo, devi definire l'operatore come funzione libera:
    codice:
    std::ostream & operator<<(const Persona & p, std::ostream & os)
    {
        return os<<p.nome<<" "<<p.eta<<" ";
    }
    Se nome ed eta sono private, dovresti rendere la funzione in questione friend, oppure fornire dei metodi getter (cosa che potrebbe avere più senso).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    98
    mm.. quando compilo g++ mi dice:

    "error: ‘std:stream& Persona:perator<<(const Persona&, std:stream& )’ must take exactly one argument"

    Non capisco bene dov'è il problema..

    p.s Ho visto su internet che in genere si usa ( std:stream&, const Persona& ) ma comunque anche se cambio l'ordine l'errore è sempre lo stesso

    EDIT:
    Usando:
    codice:
    ostream& Persona::operator<<(ostream& os)
    {
    	return os << this->nome << " "<< this->eta << " ";
    }
    e usando:
    oggetto_persona << oggetto_ostringstream;

    funziona!

    ma io vorrei che la relazione sia al contrario, cioè vorrei avere:
    oggetto_ostringstream << oggetto_persona;

    ma con lo stesso risultato, come posso fare?

    EDIT:
    Anzi no va bene anche così, grazie mille!!

  5. #5
    Originariamente inviato da GrG

    ma io vorrei che la relazione sia al contrario, cioè vorrei avere:
    oggetto_ostringstream << oggetto_studente;
    Hai ragione, e io dovrei andare a dormire perché continuo a scrivere cavolate. Nell'ultimo blocco di codice che ho scritto i due argomenti vanno invertiti:
    codice:
    std::ostream & operator<<(std::ostream & os, const Persona & p)
    {
        return os<<p.nome<<" "<<p.eta<<" ";
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.