Passare funzioni come argomenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 36 di 61.
Uno degli usi più potenti dei puntatori a funzione è passarli come argomenti ad altre funzioni. Questo ti permette di inserire un comportamento personalizzato in una funzione senza modificarne il codice: una tecnica talvolta chiamata callback.
Considera una funzione che esegue un calcolo su due numeri. Invece di codificare rigidamente l'operazione, puoi accettare un puntatore a funzione che definisce quale operazione eseguire:
typedef int (*Operation)(int, int);
int compute(int a, int b, Operation op) {
return op(a, b);
}La funzione compute non sa se sta sommando, sottraendo o facendo qualcos'altro. Si limita a chiamare la funzione che le viene passata:
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
printf("%d\n", compute(5, 3, add)); // Output: 8
printf("%d\n", compute(5, 3, multiply)); // Output: 15
return 0;
}Nota come la stessa funzione compute produce risultati diversi in base alla funzione che le passiamo. Questo schema è fondamentale per scrivere codice flessibile e riutilizzabile. Scrivi la struttura una sola volta e chi usa la tua funzione fornisce la logica specifica di cui ha bisogno.
Sfida
FacileScrivi una funzione apply_twice che accetta due interi e un codice operazione, applica l’operazione ai numeri due volte in sequenza e restituisce il risultato finale.
La tua funzione riceverà un codice operazione che determina quale operazione usare. Devi definire le funzioni operazione all’interno della tua soluzione e passarle a una funzione ausiliaria compute che accetta un puntatore a funzione.
Nota: sono necessarie solo le funzioni. I test chiamano direttamente apply_twice e ne controllano il valore restituito, quindi non leggere input né stampare nulla.
Struttura richiesta:
- Definisci un
typedefchiamatoOperationper un puntatore a funzione che accetta due parametriinte restituisce unint - Definisci due funzioni operazione:
add(restituisce a + b) emultiply(restituisce a * b) - Definisci una funzione
computeche accetta due interi e un puntatore a funzioneOperation, quindi restituisce il risultato della chiamata all’operazione - In
apply_twice, seleziona l’operazione appropriata in base al codice, quindi usacomputedue volte: prima con i numeri originali, poi con il risultato e di nuovo il secondo numero
Logica:
- Seleziona la funzione operazione in base a
op_code(1 = add, 2 = multiply) - Chiama
compute(a, b, operation)per ottenere un risultato intermedio - Chiama
compute(intermediate, b, operation)per ottenere il risultato finale - Restituisci il risultato finale
Parametri:
a(int): Primo numerob(int): Secondo numeroop_code(int): Codice operazione (1 per add, 2 per multiply)
Valore restituito: Il risultato dopo aver applicato l’operazione due volte in sequenza (int)
Esempio: Con a = 5, b = 3, op_code = 1 (add):
- Primo calcolo: 5 + 3 = 8
- Secondo calcolo: 8 + 3 = 11
- Restituisci: 11
Con a = 2, b = 4, op_code = 2 (multiply):
- Primo calcolo: 2 × 4 = 8
- Secondo calcolo: 8 × 4 = 32
- Restituisci: 32
Provalo tu
int apply_twice(int a, int b, int op_code) {
// Write code here
}
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