next up previous contents
Next: Opérateur d'incrémentation ++ Up: Surcharges d'opérateurs Previous: Opérateur () appel de

Opérateur -> d'accès

x->m correspond à (x.operator->())->m, il doit donc retourner quelque chose sur lequel l'opérateur -> s'applique (un pointeur). Il s'agit d'un opérateur postfixe unaire.

Il peut permettre d'obtenir des pointeurs ``intelligents'' (smart pointer) qui font plus que retourner l'objet pointé.

Il paraît utile de maintenir la cohérence entre les opérateurs surchargés et leur usage non surchargé ; par exemple, si on surcharge l'opérateur -> , il semble aussi raisonnable de surcharger de façon cohérente les autres opérateurs associés en C++ aux pointeurs, comme * et []. De même, une surcharge de + devrait aller de paire avec une surcharge des opérateurs += et ++.

Exemple : dans cet exemple on définit une classe ptr_tab de pointeurs qui évoluent dans des tableaux avec vérification de non débordement.

#include <stdlib.h>
template <class T>
class ptr_tab{
    T * actuel;
    T * debut;
    T * fin; 
    int est_ok(){
        return actuel<fin && actuel>=debut;
    }
    void erreur_intervale(){
        // devrait générer une exception
        cerr<<"erreur hors zone\n";
        exit(0);
    }
        
public:
    ptr_tab(T *s, size_t nelem){
        actuel=debut=s; fin=debut+nelem;}
    ptr_tab(T *s,size_t nelem,size_t dep){
        debut=s; fin=debut+nelem; actuel=s+dep;}
    T operator*(){
        if(!est_ok())erreur_intervale();
        return *actuel;}
    T* operator->(){
        if(!est_ok())erreur_intervale();
        return actuel;}
    T operator[](int i){ 
        if(actuel+i<fin&&actuel+i>=debut)erreur_intervale();
        return *(actuel+i);}   
    T* operator++(){
        actuel +=1;
        if(!est_ok())erreur_intervale();
        return actuel;
    }
    T* operator++(int){
        if(!est_ok())erreur_intervale();
        return actuel++;
    }
    T* operator--(int){
        if(!est_ok())erreur_intervale();
        return actuel--;
    }
    T* operator--(){
        actuel -= 1;
        if(!est_ok())erreur_intervale();
        return actuel;
    }
    int n_elem_fin(){       // retourne le nombre d'elem avant la fin
        return fin-actuel;
    }
    int n_elem_debut(){     // retourne le nombre d'elem depuis le fin
        return actuel-debut;
    }
};

struct couple{int i,j;
    istream & lire(istream& is){
        is>>i>>j;
        return is;
    }
    ostream & ecrire(ostream& os)const{
        os<<"("<<i<<","<<j<<")\n";
        return os;
    };
};
ostream & operator<<(ostream& os, const couple& c){
    return c.ecrire(os);
}
istream & operator>>(istream& is, couple& c){
    return c.lire(is);
}

void main()
{   
    couple t[4];
    ptr_tab<couple> p(t,4),q(t,4);
    while(p.n_elem_fin()>0){cin>>*p++;}
    while(p.n_elem_debut()>0){cout<<(--p)->i<<" ";}
}




Mon Oct 20 14:02:48 MET 1997