2009-07-29 16 views
5

ho una classe che utilizza una struttura, e voglio sovraccaricare l'operatore < < per questo struct, ma solo all'interno della classe:operatore di sovraccarica << all'interno di una classe in C++

typedef struct my_struct_t { 
    int a; 
    char c; 
} my_struct; 

class My_Class 
{ 
    public: 
    My_Class(); 
    friend ostream& operator<< (ostream& os, my_struct m); 
} 

Posso solo compilare quando dichiaro l'overload dell'operatore < < w/la parola chiave friend, ma l'operatore è sovraccaricato ovunque nel mio codice, non solo nella classe. Come sovraccarico l'operatore < per my_struct SOLO all'interno della classe?

Edit: io voglio utilizzare l'operatore di overload per stampare un my_struct che è un membro del my_class

+2

Ma è solo sovraccarico quando si chiama l'operatore << 'con un' my_struct', quindi non è così? –

+3

Nota che l'idioma "typedef struct" non è realmente necessario in C++: http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c –

risposta

9

Come faccio a sovraccaricare l'operatore di < < per my_struct solo all'interno della classe?

definirlo come

static std::ostream & operator<<(std::ostream & o, const my_struct & s) { //... 

o

namespace { 
    std::ostream & operator<<(std::ostream & o, const my_struct & s) { //... 
} 

nel file .cpp in cui si sceglie di implementare MyClass.

MODIFICA: Se davvero, davvero bisogno di ambito sulla classe e nient'altro, quindi definirlo come una funzione statica privata in detta classe. Sarà solo in ambito in quella classe ed è sottoclassi. Nasconde tutte le altre personalizzazioni definite da operator<< per classi non correlate, anche se (di nuovo, solo all'interno della classe, ed è sottoclasse), a meno che non possano essere trovate con ADL o siano già membri di std::ostream.

+0

Ne presumi uno Il file .cpp contiene solo una classe, che spesso non è il caso. –

+0

Questo è il caso della maggior parte delle mie classi. Se c'è una seconda classe nel file '.cpp', è un dettaglio di implementazione della classe" main ", e l'esposizione estesa non ha importanza e aiuta a mantenere pulito il file '.h', che non dovrebbe mai essere sottovalutato –

+0

+1 Ho pensato che lo spazio dei nomi senza nome avrebbe infranto le regole ADL, ma dopo aver provato con g ++ e comeau sembra –

10

Non usare operatore < <. Utilizzare una funzione membro denominata e renderla privata.

class My_Class 
{ 
    public: 
    My_Class(); 
private: 
    void Print(ostream & os, const my_struct & m); 
}; 

Nota è necessario passare la struttura come riferimento const, a seconda del metodo utilizzato.

Edit: Non c'è bisogno di fare l'operatore < < un membro della classe solo così si può usare per stampare un membro della classe. Puoi renderlo un amico della struct, o una funzione completamente libera, che la classe quindi usa.

1

Se per "solo sovraccarico in My_Class" si intende solo visibile/utilizzabile dalla mia classe, è possibile utilizzare un overload non membro visibile solo a My_Class. Per esempio.

struct my_struct { 
     int a; 
     char c; 
    }; 

    class My_Class 
    { 
     publiC: 
     My_Class(); 
    } 

Poi nel My_Class.cpp:

namespace { 
    ostream& operator(ostream& os, const my_struct& mystruct) { 
     os << mystruct.a << mystruct.c; 
    } 
} 
+0

Perché stai eliminando & risposte non annullate che dicono la stessa cosa? –

+0

Intendevo modificare e in qualche modo ottenere una copia della risposta. Quindi ho cancellato il primo.Poi la domanda è cambiata, quindi ho cancellato la mia seconda e stavo per aggiungere una terza risposta, ma ho suggerito di modificare una esistente, quindi ho cancellato il primo ed editato dal momento in cui era un tuo clone :-( – maccullt

Problemi correlati