Dichiarare puntatori a funzione
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 33 di 61.
Finora abbiamo imparato a simulare l’ereditarietà usando l’incorporamento di struct. Ma il vero polimorfismo, in cui oggetti diversi rispondono in modo diverso alla stessa chiamata, richiede qualcosa in più: puntatori a funzione.
Un puntatore a funzione è una variabile che memorizza l'indirizzo di una funzione. Proprio come un normale puntatore contiene l'indirizzo di un dato, un puntatore a funzione contiene l'indirizzo di codice eseguibile.
La sintassi può sembrare intimidatoria all'inizio. Per dichiarare un puntatore a funzione, specifica il tipo restituito, poi il nome del puntatore tra parentesi con un asterisco, seguito dai tipi dei parametri:
int (*operation)(int, int);Questo dichiara una variabile chiamata operation che può puntare a qualsiasi funzione che accetta due parametri int e restituisce un int. Le parentesi intorno a *operation sono fondamentali: senza di esse, dichiareresti una funzione che restituisce un puntatore.
Per assegnare una funzione a questo puntatore, usa semplicemente il nome della funzione (senza parentesi):
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // Ora operation punta a addIl nome della funzione funge da indirizzo. Puoi anche usare esplicitamente &add, ma è facoltativo: in C entrambe le forme sono equivalenti.
Sfida
FacileFacciamo pratica con la dichiarazione di puntatori a funzione e l'assegnazione di funzioni a essi. Creerai un semplice sistema di operazioni matematiche in cui un puntatore a funzione può contenere diverse funzioni aritmetiche.
Scrivi un programma che:
- Definisce due funzioni:
multiply: accetta due parametriinte restituisce il loro prodottosubtract: accetta due parametriinte restituisce il primo meno il secondo
- In
main, dichiara una variabile puntatore a funzione chiamataoperationche può puntare a funzioni che accettano due parametriinte restituiscono unint - Legge tre input: due numeri interi e un codice operazione (1 per moltiplicare, 2 per sottrarre)
- In base al codice operazione, assegna la funzione appropriata al puntatore
operation - Stampa il nome dell'operazione assegnata, poi stampa il risultato della chiamata alla funzione tramite il puntatore
Riceverai tre input: il primo numero, il secondo numero e il codice operazione (1 o 2).
L'output dovrebbe apparire così:
Operation: multiply
Result: 35Dove multiply è il nome dell'operazione (oppure subtract se il codice è 2) e 35 è il risultato della chiamata alla funzione tramite il puntatore (in questo caso, 5 × 7).
Ricorda: per dichiarare il puntatore a funzione, ti servono il tipo restituito, il nome del puntatore tra parentesi con un asterisco e i tipi dei parametri. Per assegnare una funzione, usa solo il nome della funzione senza parentesi.
Provalo tu
#include <stdio.h>
// TODO: Definisci qui la funzione multiply
// TODO: Definisci qui la funzione subtract
int main() {
int num1, num2, code;
// Leggi l'input
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: Dichiara un puntatore a funzione chiamato 'operation' che possa puntare a
// funzioni che accettano due parametri int e restituiscono un int
// TODO: In base al codice dell'operazione (1 per multiply, 2 per subtract),
// assegna la funzione appropriata al puntatore operation
// TODO: Stampa il nome dell'operazione e il risultato
// Formato:
// Operation: <name>
// Result: <result>
return 0;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta7Puntatori a funzione
Dichiarare puntatori a funzioneChiamare i puntatori a funzioneTypedef per puntatori a funzionePassare funzioni come argomentiRiepilogo: dispatch della calcolatrice2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online