The C++ Compass

The C++ Compass
>FAQ<

FAQ

Home
Home

Risorse
Risorse

Utilities
Utilities

Compilatori
Compilatori

GUI Toolkits
GUI Toolkits

Libri
Libri

Download
Download

FAQ
FAQ



whoami
Who am I
[Precedente] [Indice] [Successiva]


[Libreria standard e containers]


[Puntatori]


Come dichiaro un puntatore a funzione e come richiamo quest'ultima ?

Dipende che argomenti prende, e che tipo di valore ritorna, la funzione che si vuole chiamare. Ad esempio, a una funzione che prende un double e torna un int si potrebbe dichiarare un puntatore così (tutto quanto segue vale nell'ipotesi che si voglia effettivamente un puntatore a funzione, non un puntatore-a-metodo che è tutta un'altra cosa; in altri termini, questo vale per funzioni libere, o membri statici di una qualche classe, non per metodi di un oggetto, che hanno sintassi e semantica drasticamente diversi):

MiaClasse::Funzione(int (*ilpunt)(double))

e chiamarlo, ad esempio, così:

int risult = ilpunt(23.45);

Come sempre in C e C++, le dichiarazioni con sintassi strana è meglio gestirle con un typedef:

typedef int (*pfun_double_int_t)(double);

MiaClasse::Funzione(pfun_double_int_t ilpunt)

comunque, è solo una questione di stile, manutenibilità, e leggibilità -- il codice generato sarà esattamente lo stesso.
Volendo, in fase di chiamata, si può preporre al "ilpunt" una operatore di dereferencing, cioè chiamare:

int risult = (*ilpunt)(23.45);

ma non avrebbe particolarmente senso farlo (si può mettercene piu` di uno, volendo) -- è decisamente più leggibile omettere l'asterisco e relative parentesi, e la semantica è rigorosamente identica.
E per i puntatori a metodi di un oggetto come faccio ?
Non si fa: un puntatore-a-metodo è sempre su di una specifica classe (non esiste, insomma, l'equivalente di quello che sarebbe un void* per un puntatore-a-dato), esattamente come un puntatore-a-funzione è sempre per specifici tipi di argomenti e risultato (non c'è, in C++ standard nè in C standard, nessuna garanzia di potere fare dei cast fra diversi puntatori-a-funzioni, o fra essi e puntatori-a-dati: qualsiasi cast del genere è "undefined behaviour", cioè, un dato compilatore può, come estensione, scegliere di definire questo comportamento, ma non è tenuto a farlo).
Per la grande maggioranza dei problemi che "sembrerebbe" ideale risolvere con "puntatori a metodi di oggetti qualunque", la soluzione ideale sta invece nell'uso di TEMPLATE ("generic programming"); altri si possono risolvere con eredità multipla da classi-interfacce di "mix-in", e RTTI; altri ancora richiedono una rifattorizzazione del proprio progetto.




Ultimo aggiornamento : 03/07/2000

email webmaster@thecppcompass.org