2010-10-27 26 views
5

Diciamo che creo una classe, come, che contiene un array di caratteri. Ora, che cosa operatore gestisce questo:Domanda sull'operatore ostream <<

myClass inst; 
cout << inst; 

Al "cout < < inst;" come si chiama, semplicemente con il nome della classe? Grazie.

+6

L'operatore < Shog9

+0

Ingannevole: D. Mi hai portato lì MrGreen. Haha. Grazie. Quindi la mia domanda iniziale è stupida come sempre, dato che non è necessario avere un "valore di ritorno" universale, è possibile definirlo con ogni operatore incluso l'operatore di shift binario, ecc ... Ho capito bene? –

+0

Uomo perfetto, grazie. –

risposta

12

Ciò che viene chiamato è std::ostream &operator<<(std::ostream &, myClass const &). Puoi sovraccaricare questo se vuoi.

2

Il compilatore cercherà un sovraccarico di operator<<. In particolare, si cercherà sia un sovraccarico di membro-funzione del std::ostream (non esisterà), o di una funzione libera, che si dovrebbe sovraccaricare con il seguente prototipo:

std::ostream &operator<< (std::ostream &os, const myClass &x); 

potrebbe essere necessario per rendere questo un amico di myClass se è necessario accedere a membri protetti/privati.

2

Questo genera un errore del compilatore, a meno che non si disponga di un operatore typecast sovraccarico per un tipo che ostream conosce. Puoi aggiungere i tuoi tipi ai tipi che ostream conosce sovraccaricando il ostream& operator(ostream& os, const myClass& x) globale o rendendo il tuo tipo convertibile in una stringa/int ecc. Attenzione però, il sovraccarico di typecast può spararti ai piedi ed è considerato una cattiva pratica.

Il modo più semplice è solo stampando alcune variabili della tua classe:

myClass inst; 
cout << inst.getName() << ": " << inst.getSomeValue(); 
1

Per essere in grado di utilizzare std::cout << someClass, è necessario creare un operatore come segue:

std::ostream &operator<< (std::ostream &, const someClass &); 
4

Con la creazione di un amico operatore di output, come nell'esempio seguente.

#include <iostream> 

class MyClass { 
    friend std::ostream & operator<<(std::ostream &out, const MyClass &inst); 
public: 
    // ... public interface ... 
private: 
    char array[SOME_FIXED_SIZE]; 
}; 

std::ostream & operator<<(std::ostream &out, const MyClass &inst) 
{ 
    out.write(inst.array, SOME_FIXED_SIZE); 
    return out; 
} 

Si prega di non questo rende alcune ipotesi su ciò che si intende per "char", si è notevolmente semplificata se la matrice char è in realtà nul (0 carattere) terminato.

Aggiornamento: Dirò che questo non è strettamente un valore di ritorno per la classe, ma piuttosto una rappresentazione testuale della classe, che sei libero di definire.

+0

Non deve essere la funzione amico, ma è necessario aggiungere un altro metodo di funzione pubblico alla classe, che stamperà realmente valori (o qualsiasi altra cosa) sull'ostream. –

+0

È possibile che tutte le informazioni necessarie per stampare l'oggetto siano disponibili in funzioni pubbliche. L'operatore <<() 'deve essere esterno alla classe (poiché il primo argomento non è del tipo di classe). Può essere un 'amico', se ottiene tutte le informazioni dall'interfaccia di classe pubblica. Può chiamare una funzione membro per eseguire la stampa, e talvolta questa è una buona idea. –

+0

@VJo + @David - sì, sono assolutamente d'accordo che non è necessario essere una funzione di amicizia se è possibile raccogliere tutte le informazioni dall'interfaccia pubblica. –

Problemi correlati