Nella programmazione, con il termine overloading si intende una famiglia di funzioni/subroutine aventi lo stesso nome, ma con la possibilità di accettare un diverso set di argomenti. Un ampio utilizzo di questa tecnica avviene quando ci si ritrova ad utilizzare un linguaggio orientato agli oggetti, mettiamo di avere la seguente classe:
{
private:
double _r;
double _i;
public:
Complex(int r, int i);
Complex(float r, float i);
Complex(double r, double i);
Complex(Complex c);
};
Se volessimo fare un operazione di confronto tra due numeri complessi siamo costretti ad eseguire l’overload dell’operatore = cioè dichiarare un metodo del genere:
Una lista di tutti gli operatori overloadabili si può trovare a questo link. In questo breve articolo cercherò di spiegare solo come comportarsi se si vuole avere a che fare con l’operatore [].
Questo operatore solitamente può essere utilizzato in due differenti casi :
- quando estraiamo un valore da un vettore / matrice
- quando associamo ad un elemento di un vettore /matrice un valore
Se avete bisogno di eseguire l’overload del primo caso la dichiarazione del metodo è la seguente:
Per il secondo caso invece :
Ecco una classe che gestisce un vettore dinamico (nel codice sono utilizzati in modo esauriente questi due casi):
using namespace std;
class VettoreDinamico{
public:
VettoreDinamico();
~VettoreDinamico();
int Dimensione();
void Dimensione(int n);
int & operator[] (int i);
int operator[] (int i) const ;
friend ostream &operator<<(ostream &s,const VettoreDinamico v);
private:
int dim;
int *vettore;
};
VettoreDinamico::VettoreDinamico(){
dim=0;
vettore=NULL;
}
VettoreDinamico::~VettoreDinamico(){
delete [] vettore;
}
int VettoreDinamico::Dimensione(){
return dim;
}
void VettoreDinamico::Dimensione(int n){
if(dim==0){
dim=n;
vettore=new int[n];
for(int i=0;i<n;i++)
vettore[i]=0;
} else {
int *tmp=new int[n];
for(int i=0;i<n;i++)
tmp[i]=0;
for(int i=0;i<dim;i++)
tmp[i]=vettore[i];
delete [] vettore;
vettore=tmp;
dim=n;
}
}
int VettoreDinamico::operator[] (int i) const {
return vettore[i];
}
int & VettoreDinamico::operator[] (int i){
if(i>dim)
Dimensione(i+1);
return vettore[i];
}
ostream & operator<<(ostream &s,const VettoreDinamico v){
for(int i=0;i<v.dim;i++)
s << v.vettore[i] << " ";
return s;
}
/*==========================================*/
int main(){
VettoreDinamico V;
V.Dimensione(10);
V[12]=10;
cout << V.Dimensione();
cout << V;
system("pause");
return 0;
}
