| 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 |
| 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 |
| 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); |