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

È stato utile?

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top