PDA

Visualizza la versione completa : [C++] Puntatori a funzione (e loro utilità)


ilovecofee
01-09-2017, 14:37
salve a tutti, mi son trovato davanti un esercizio, ecco il codice sorgente:


#include <iostream>
#include <iomanip>


using namespace std;


int addizione (int a, int b) {return (a+b);}


int sottrazione (int a, int b){return (a-b);}


int Operazione(int x, int y, int (*FunzioneDaLanciare) (int,int))
{
int g;
g=(*FunzioneDaLanciare) (x,y);
return g;
}


int main()
{
int m,n;
int (*meno) (int,int) = sottrazione;


m= Operazione(2, 1, addizione);


n= Operazione(10, m, meno);
cout << n;
return 0;
}


non riesco a capire la funzione operazione, cosa dovrebbe fare o meglio quello che mi manda in pappa è il puntatore funzione da lanciare, qualcuno riesce a spiegarmela?

oregon
01-09-2017, 15:24
Un puntatore a funzione contiene l'indirizzo della prima istruzione del codice relativo ad una funzione da eseguire. Non c'è molto da dire ... cosa non comprendi esattamente?

ilovecofee
01-09-2017, 15:54
Hai ragione forse mi sono espresso male, non comprendo l'utilizzo di codice in piu, a quale scopo? io avrei svolto cosi l'esercizio:


#include <iostream>
using namespace std;


int addizione (int a, int b) {return (a+b);}


int sottrazione (int a, int b){return (a-b);}


int main()
{
int m,n;
m= addizione(7, 5);
cout << m << endl;
n= sottrazione(20, m);
cout << n;
return 0;
}

MItaly
04-09-2017, 01:15
Hai perfettamente ragione, in questo caso l'uso dei puntatori a funzione è assolutamente inutile; normalmente vengono usati in altri casi, ad esempio:
- come callback; immagina ad esempio una libreria per effettuare connessioni HTTP; se vuoi gestire download grossi o in generale processare i dati man mano che arrivano un approccio comune è di fornire un callback, ovvero una funzione che viene richiamata di tanto in tanto passandole i dati che sono arrivati finora. Per specificare la funzione in questione si usano i puntatori a funzione;
- un altro caso diffuso come callback è per toolkit grafici - ad ogni evento (click del mouse, mouse mosso, ...) può essere associata una funzione custom da richiamare; anche questo si può fare tramite puntatori a funzione (anche se in C++ spesso si sfrutta piuttosto l'ereditarietà e i metodi virtuali - che però alla fine sono puntatori sotto mentite spoglie);
- per algoritmi generici, in cui una parte dell'algoritmo dev'essere fornita dall'esterno; un esempio classico è il sort, in cui il criterio di ordinamento non è fissato, ma può essere fornito dall'utilizzatore dell'algoritmo; è il caso della funzione di libreria C qsort, come pure di uno degli overload di std::sort (dove però viene accettato un generico functore, non è limitata all'uso di puntatori a funzione).

Loading