Problema con overloading di <<

di il
1 risposte

Problema con overloading di <<

Salve a tutti. Problema: ho una gerarchia di classi Impiegato e dirigente (impiegato superclasse e dirigente sottoclasse) e devo stampare a video e su file dei dati dell'uno e dell'altro secondo le funzioni membro che sono implementate. Per stampare a video non ho problemi. Per la stampa su file io faccio l'overloading di << nella superclasse poi rifaccio l'overloading di << nella sottoclasse per riscrivere i dati dei dirigenti su file. Il problema nasce dalla funzione operator. Nella superclasse è una funzione amica, e poi la dovrei richiamare come faccio per la funzione stampa per la stampa a video (Impiegato::stampa) come si fa a richiamare una funzione operator?
Posto i codici:
//Impiegato.h

#ifndef IMPIEGATO_H
#define IMPIEGATO_H

using namespace std;

class Impiegato
{
      protected:
                char *nome;
                double stipendio;
                char assunzione[11];
      public:
                Impiegato (const char*, const double, const char []);
                ~Impiegato (); 
                void setstipendio (double);
                char *getnome () const;
                double getstipendio () const;
                void getassunzione () const;
                double calcola_stip_im (int, double);
                void stampa () const;
                friend ostream & operator << (ostream &os, const Impiegato &im);               
};

#endif
//Impiegato.cpp

#include <iostream>
#include <cstdlib>
#include <cstring>
#include "Impiegato.h"

using namespace std;

Impiegato :: Impiegato (const char *n, const double s, const char v[])
{
          nome = new char[strlen(n)+1];
          strcpy (nome,n);
          setstipendio(s);
          strcpy (assunzione,v);
}

Impiegato :: ~Impiegato () { delete [] nome; }

void Impiegato :: setstipendio (double st) { stipendio = st; }

char* Impiegato :: getnome () const { return nome; }

double Impiegato :: getstipendio () const { return stipendio; }

void Impiegato :: getassunzione () const 
{
     for (int i=0; i<11; i++)
     cout << assunzione[i];
}

double Impiegato :: calcola_stip_im (int numero_ore, double paga_oraria)
{
       return (stipendio+(numero_ore*paga_oraria));
}

void Impiegato :: stampa () const
{
       cout << "Nome: " << nome << endl;
       cout << "Stipendio base: " << stipendio << " euro" << endl;
       cout << "Data di assunzione: " << assunzione << endl;
}

ostream & operator << (ostream &os, const Impiegato &im)
{
       os << "Nome: " << im.nome << endl 
          << "Stipendio base: " << im.stipendio << endl 
          << "Data di assunzione: " << im.assunzione << endl;
       return os;
} 

//Dirigente.h

#ifndef DIRIGENTE_H
#define DIRIGENTE_H
#include "Impiegato.h"

using namespace std;

class Dirigente : public Impiegato
{
      private:
              char *dipartimento;
              int anzianita;
      public:
              Dirigente (const char*, const double, const char [], const char*, const int);
              ~Dirigente ();
              void setdipartimento (const char*);
              char *getdipartimento () const;
              int getanzianita () const;
              double calcola_stip_dir (int, double, int);
              void stampa () const;
              friend ostream & operator << (ostream &os, const Dirigente &di);                      
};

#endif
//Dirigente.cpp

#include <iostream>
#include <cstdlib>
#include <cstring>
#include "Dirigente.h"

using namespace std;

Dirigente :: Dirigente (const char *x, const double y, const char z[], const char *h, const int in) : Impiegato(x,y,z)
{
          dipartimento = new char[strlen(h)+1];
          setdipartimento(h);
          anzianita = in;
}

Dirigente :: ~Dirigente () { delete [] dipartimento; }

void Dirigente :: setdipartimento (const char* n) { strcpy(dipartimento,n); }

char* Dirigente :: getdipartimento () const { return dipartimento; }

int Dirigente :: getanzianita () const { return anzianita; }

double Dirigente :: calcola_stip_dir (int numero_ore, double paga_oraria, int X)
{
          double X1 = (calcola_stip_im(numero_ore,paga_oraria)/100)*X;  
          return (calcola_stip_im(numero_ore,paga_oraria)+X1);
}

void Dirigente :: stampa () const
{
          Impiegato :: stampa ();
          cout << "Dipartimento: " << dipartimento << endl;
          cout << "Anzianità: " << anzianita << " anni" << endl;
}

ostream & operator << (ostream &os, const Dirigente &di)
{
          os << "Dipartimento: " << di.getdipartimento() << endl;
          os << "Anzianità: " << di.getanzianita() << " anni" << endl;
}
//main.cpp

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include "Dirigente.h"

using namespace std;

int main ()
{
        ofstream out_dati ("Dati.txt", ios::out);
        Impiegato im("Fabrizio Gatti", 300000, "20/10/2010");
        Dirigente di("Mario Rossi", 500000, "10/10/2009", "Informatica e sistemistica", 25);
        cout << "IMPIEGATO" << endl;
        out_dati << "IMPIEGATO" << endl;
        im.stampa();
        out_dati << im << endl;
        cout << endl;
        cout << "DIRIGENTE" << endl;
        out_dati << "DIRIGENTE" << endl;
        di.stampa();
        out_dati << di;
        cout << endl;
        cout << "Stipendio corrente impiegato: " << im.calcola_stip_im(24, 25.50) << " euro" << endl;
        cout << "Stipendio corrente dirigente: " << di.calcola_stip_dir(30, 34.50, 20) << " euro" << endl;
        
        cout << endl << endl;
        system ("PAUSE");
        return 0;
} 
Nella funzione dirigente.cpp è ridefinito l'operatore << che stampa dipartimento e anzianità ma dovrei richiamare la funzione operator della superclasse che mi stampa anche nome stipendio base e data assunzione. Come si fa? Poi la funzione getassunzione() l'ho messa come void è corretta? La get di assunzione mi dovrebbe restituire un vettore ma se faccio
char getassunzione () const
{
return assunzione[11];
}
non mi dà la stringa opportuna. Grazie per eventuali risposte.

1 Risposte

  • Re: Problema con overloading di <<

    Che io sappia, stai sbagliando a fare l'overload del << già nella base. la funzione friend è OK, la funzione stampa dev'essere così:
    
    ...................
    Impiegato
    
    .h
     virtual void stampa () const;
    ..................
    .cpp
    void Impiegato :: stampa () const
    {
           cout << *this;
    }
    
    ...........................
    Dirigente

    nella classe dirigente la funzione stampa dev'essere così.
    
    void Dirigente :: stampa () const
    {
    	cout << *this;
    }
    
    nella funzione friend invece devi fare il downcast da derived a base e poi chiamare l'operatore << della base.
    
    ostream & operator << (ostream &os, const Dirigente &di)
    {         
    	const Impiegato & im = dynamic_cast<const Impiegato &>(di);
    	os << im;
    	os << "Dipartimento: " << di.getdipartimento() << endl;
    	os << "Anzianita\': " << di.getanzianita() << " anni" << endl;
    	return os;
    }
    
Devi accedere o registrarti per scrivere nel forum
1 risposte