Overloading operatore []

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:

class Complex
{
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:

bool operator=(const Complex C);

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:

int operator[] (int i) const ;

Per il secondo caso invece :

 int & operator[] (int i);

Ecco una classe che gestisce un vettore dinamico (nel codice sono utilizzati in modo esauriente questi due casi):

#include <iostream>
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;  
}
Be Sociable, Share!