Logo UGIdotNET

Discussione 'C++ e puntatori a funzioni'

# Pubblicato il 17 set 2003 9.51 - Rispondi
Filippo Santovito
C++ e puntatori a funzioni
Ciao a tutti,
ho la necessita di recuperare il puntatore a una funzione che è metodo pubblico di una classe. Esiste un modo per riuscire a farlo?
Ho provato con codice tipo:

bool (*f)(const long&); //dichiarazione di un pnt a funzione
/*
Istanza di un mio oggetto che contiene il metodo bool function(const long&);
*/
MyClass MC;
f = MC.function; //in vc++6 ottengo l'errore C2563

Aspetto vostre notizie....
Filippo
# Pubblicato il 18 set 2003 12.16 - Rispondi
Gianluca Carucci
Re: C++ e puntatori a funzioni
Da quello che so(molto poco e quindi aspetto smentite e/o integrazioni da Raffaele e co&) puoi passare solo un puntatore a un metodo statico di una classe. Questo dovresti poterlo fare sicuramente. Per avere il puntatore a un metodo non statico è più problematico, perchè in questo caso hai anche il problema di dover recuperare l'istanza della classe. E questo non saprei se si può e come si fa.
Gianluca
# Pubblicato il 18 set 2003 14.34 - Rispondi
Francesco Carucci
Re: C++ e puntatori a funzioni
on 17. Sep 2003 09:51 Filippo Santovito wrote:
> Ciao a tutti,
> ho la necessita di recuperare il puntatore a una funzione che è metodo pubblico
> di una classe. Esiste un modo per riuscire a farlo?
> Ho provato con codice tipo:
>
> bool (*f)(const long&); //dichiarazione di un pnt a funzione
> /*
> Istanza di un mio oggetto che contiene il metodo bool function(const long&);
> */
> MyClass MC;
> f = MC.function; //in vc++6 ottengo l'errore C2563
>
> Aspetto vostre notizie....
> Filippo
>

Ciao.

Un puntatore ad un metodo e' (per quanto ci riguarda, ma poi dipende dalle implementazioni) la stessa cosa di un puntatore a funzione libera. Cambia la sintassi.

Se hai una classe A dichiarata cosi':

class A
{

public:

void mf1();
int mf2(int x);

};

Dove mf1() e' una member function, puoi dichiarare un puntatore a quella member function di una generica classe A in questo modo:

void (A::*pmf1)() = &A::mf1;

Con questa dichiarazione stai dichiarando una variabile chiamata pmf1 che e' un puntatore ad una member function della classe A che ritorna void e non accetta parametri (ha signare void () per intenderci).
Il tipo della member function e' void (A::*)(). Puoi usare un typdef per semplificarti la vita:

typedef void (A::*pmf1_A)();

pmf_A pmf1 = &A::mf1;

Per invocare il metodo puntato da pmf su un oggetto usi uno degli operatori .* o ->*:

pmf1_A pmf1 = &::mf1;

A a;
A *pa = new A;

(a.*pmf1)(); // invoca il metodo puntato da pmf sull'oggetto a;
(pa->*pmf1)(); // invoca il metodo puntato da pmf sull'oggetto puntato da pa;

Nota le parentesi, che sono richieste perche' l'operatore * ha precedenza minore dell'operatore (). Ebbene si', le parentesi sono operatori tanto che possono essere sottoposte ad overload, ma questo e' un altro discorso :)

Altro esempio:

typedef int (A::*pmf2_A)(int);

pmf2_A pmf2 = &A::mf2;

A a;

int x = 20 + (a.*mf2)(10);

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185