|
Abbiamo già visto i function pointers in un articolo
precedente.
Vediamo ora di analizzare i puntatori a funzione membro di una
classe.
Poniamo di avere una classe, chiamata CSprite come la seguente:
class
CSprite
{
private:
int posx,posy;
public:
void Draw()
{
// Draw here sprite to screen
}
};
Come possiamo dichiarare un puntatore alla
funzione membro draw()?
Per farlo dobbiamo considerare il fatto che bisogna specificare
anche la classe cui la funzione appartiene.
Bisogna quindi specificarla nel seguente modo:
// Dichiarazione
// Notare che viene specificato CSprite::
void (CSprite::*mptrDraw)();
Per assegnare il puntatore alla funzione anche
in questo caso si specifica la classe di appartenenza:
//
Assegniamo funzione a puntatore
mptr = CSprite::Draw;
Fin qui tutto abbastanza semplice, direi...
Più complicata la questione quando si tratta di usare il
puntatore alla funzione membro. Dato che il puntatore è associato
ad un oggetto di una classe, deve sempre venire usato o attraverso
un oggetto della stessa classe, oppure un puntatore ad un oggetto
di quella classe.
Se si utilizza quindi la funzione esternamente
alla classe, bisogna prima istanziare un oggetto di quella classe:
//
Oggetto CSprite
CSprite sprite;
//
Invochiamo funzione Draw() attraverso function pointer
(sprite.*mptr)();
Nel caso invece si voglia invocare la funzione
all'interno della classe, si ricorre a this:
CSprite::DrawWithPointer()
{
(this->*mptr)();
}
Come si vede rispetto ai puntatori a funzione, l'unica vera differenza
da tenere sempre presente è che ogni puntatore a funzione
membro deve essere sempre associato ad un oggetto di quella classe.
|