operatore di sovraccarico < < all'interno di una classe in c ++
-
05-07-2019 - |
Domanda
Ho una classe che usa uno struct e voglio sovraccaricare < < operatore per quella struttura, ma solo all'interno della classe:
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 compilare solo quando dichiaro l'operatore < < sovraccarico con la parola chiave friend, ma poi l'operatore è sovraccarico ovunque nel mio codice, non solo nella classe. Come faccio a sovraccaricare < < operatore per my_struct SOLO all'interno della classe?
Modifica: voglio usare l'operatore sovraccarico per stampare un my_struct che è un membro di My_Class
Soluzione
Come posso sovraccaricare < < operatore per my_struct SOLO all'interno della classe?
Definiscilo 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 implementa MyClass
.
MODIFICA: Se davvero, hai davvero bisogno di ambito sulla classe e nient'altro, allora definiscilo come una funzione statica privata in detta classe. Sarà solo nell'ambito di quella classe e delle sue sottoclassi. Nasconderà tutti gli altri operatori personalizzati < <
definiti per le classi non correlate, anche se (di nuovo, solo all'interno della classe e delle sue sottoclassi), a meno che non possano essere trovati con ADL o siano membri di std :: ostream
già.
Altri suggerimenti
Non utilizzare l'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 che dovresti passare la struttura come riferimento const, qualunque sia il metodo che usi.
Modifica: non è necessario rendere l'operatore < < un membro della classe solo per poterlo utilizzare per stampare un membro della classe. Puoi renderlo amico della struttura, o una funzione completamente gratuita, che la classe utilizza quindi.
Se di " sovraccaricato solo in My_Class " intendi solo visibile / utilizzabile dalla mia classe, potresti usare un sovraccarico non membro che è visibile solo a My_Class. Per es.
struct my_struct {
int a;
char c;
};
class My_Class
{
publiC:
My_Class();
}
Quindi in My_Class.cpp:
namespace {
ostream& operator(ostream& os, const my_struct& mystruct ) {
os << mystruct.a << mystruct.c;
}
}