Puntatori a funzioni membro di classe
 

 

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.

 

   
 

In caso di problemi/suggerimenti non esitate a contattarmi al solito indirizzo: sakic'at'unlimited2.com

Homepage