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.