En tilbagekaldsfunktion er en funktion, der er et argument, ikke en parameter, i en anden funktion. Den anden funktion kan kaldes hovedfunktionen. Så to funktioner er involveret: hovedfunktionen og selve tilbagekaldsfunktionen. I parameterlisten over hovedfunktionen er erklæringen om tilbagekaldsfunktionen uden dens definition til stede, ligesom objektdeklarationer uden tildeling er til stede. Hovedfunktionen kaldes med argumenter (i main ()). Et af argumenterne i hovedfunktionsopkaldet er den effektive definition af tilbagekaldsfunktionen. I C ++ er dette argument en henvisning til definitionen af tilbagekaldsfunktionen; det er ikke den egentlige definition. Selve tilbagekaldsfunktionen kaldes faktisk inden for definitionen af hovedfunktionen.
Den grundlæggende tilbagekaldsfunktion i C ++ garanterer ikke asynkron opførsel i et program. Asynkron opførsel er den reelle fordel ved tilbagekaldsfunktionsordningen. I det asynkrone tilbagekaldsfunktionsskema skal resultatet af hovedfunktionen opnås for programmet, før resultatet af tilbagekaldsfunktionen opnås. Det er muligt at gøre dette i C ++; C ++ har dog et bibliotek kaldet fremtid for at garantere opførelsen af den asynkrone tilbagekaldsfunktionsplan.
Denne artikel forklarer det grundlæggende system til tilbagekaldsfunktion. Meget af det er med ren C++. For så vidt angår tilbagekaldelsen forklares den grundlæggende adfærd i det fremtidige bibliotek også. Grundlæggende viden om C ++ og dens markører er nødvendig for forståelsen af denne artikel.
Artikelindhold
- Grundlæggende ordning for tilbagekaldsfunktion
- Synkron adfærd med tilbagekaldsfunktion
- Asynkron adfærd med tilbagekaldsfunktion
- Grundlæggende brug af det fremtidige bibliotek
- Konklusion
Grundlæggende ordning for tilbagekaldsfunktion
En ordning med tilbagekaldsfunktioner har brug for en hovedfunktion, og selve tilbagekaldsfunktionen. Erklæringen om tilbagekaldelsesfunktionen er en del af parameterlisten for hovedfunktionen. Definitionen af tilbagekaldsfunktionen er angivet i hovedopgavens funktionsopkald. Tilbagekaldsfunktionen kaldes faktisk inden for definitionen af hovedfunktionen. Følgende program illustrerer dette:
#omfatteved hjælp af namespace std;
int principFn (char ch [], int (* ptr) (int))
int id1 = 1;
int id2 = 2;
int idr = (* ptr) (id2);
cout<<"principal function: "<
int cb (int iden)
cout<<"callback function"<<'\n';
returnere iden;
int main ()
int (* ptr) (int) = &cb;
char cha [] = "og";
principFn (cha, cb);
returnere 0;
Outputtet er:
tilbagekaldsfunktionhovedfunktion: 1 og 2
Hovedfunktionen identificeres af principalFn (). Tilbagekaldsfunktionen er identificeret ved cb (). Tilbagekaldsfunktionen er defineret uden for hovedfunktionen, men kaldes faktisk inden for hovedfunktionen.
Bemærk erklæringen om tilbagekaldsfunktionen som en parameter i parameterlisten i hovedfunktionserklæringen. Erklæringen om tilbagekaldsfunktionen er “int (* ptr) (int)”. Bemærk tilbagekaldsfunktionsudtrykket, som et funktionsopkald, i definitionen af hovedfunktionen; ethvert argument for callback-funktionskaldet sendes der. Erklæringen for dette funktionsopkald er:
int idr = (* ptr) (id2);Hvor id2 er et argument. ptr er en del af parameteren, en markør, der linkes til referencen for tilbagekaldsfunktionen i hovedfunktionen ().
Bemærk udtrykket:
int (* ptr) (int) = &cb;I hovedfunktionen (), der forbinder erklæringen (uden definition) af tilbagekaldsfunktionen til navnet på definitionen af den samme tilbagekaldsfunktion.
Hovedfunktionen kaldes i hovedfunktionen () som:
principFn (cha, cb);Hvor cha er en streng og cb er navnet på tilbagekaldsfunktionen uden noget af dens argument.
Synkron opførsel af tilbagekaldsfunktion
Overvej følgende program:
#omfatteved hjælp af namespace std;
ugyldig principFn (ugyldig (* ptr) ())
cout<<"principal function"<<'\n';
(* ptr) ();
ugyldig cb ()
cout<<"callback function"<<'\n';
ugyldigt fn ()
cout<<"seen"<<'\n';
int main ()
ugyldigt (* ptr) () = &cb;
principFn (cb);
fn ();
returnere 0;
Outputtet er:
hovedfunktiontilbagekaldsfunktion
set
Der er en ny funktion her. Alt, hvad den nye funktion gør, er at vise output, "set". I hovedfunktionen () kaldes hovedfunktionen, derefter kaldes den nye funktion, fn (). Outputtet viser, at koden for hovedfunktionen blev udført, derefter blev den for tilbagekaldsfunktionen udført, og til sidst blev den for fn () -funktionen udført. Dette er synkron opførsel (en tråd).
Hvis det var asynkron opførsel, når tre kodesegmenter kaldes i rækkefølge, kan det første kodesegment udføres, efterfulgt i stedet af udførelsen af det tredje kodesegment, før det andet kodesegment udføres.
Funktionen fn () kan kaldes fra definitionen af hovedfunktionen i stedet for fra hovedfunktionen () som følger:
#omfatteved hjælp af namespace std;
ugyldigt fn ()
cout<<"seen"<<'\n';
ugyldig principFn (ugyldig (* ptr) ())
cout<<"principal function"<<'\n';
fn ();
(* ptr) ();
ugyldig cb ()
cout<<"callback function"<<'\n';
int main ()
ugyldigt (* ptr) () = &cb;
principFn (cb);
returnere 0;
Outputtet er:
hovedfunktionset
tilbagekaldsfunktion
Dette er en efterligning af asynkron opførsel. Det er ikke asynkron opførsel. Det er stadig synkron opførsel.
Også rækkefølgen af udførelse af kodesegmentet for hovedfunktionen og kodesegmentet for tilbagekaldsfunktionen kan byttes i definitionen af hovedfunktionen. Følgende program illustrerer dette:
#omfatteved hjælp af namespace std;
ugyldig principFn (ugyldig (* ptr) ())
(* ptr) ();
cout<<"principal function"<<'\n';
ugyldig cb ()
cout<<"callback function"<<'\n';
ugyldigt fn ()
cout<<"seen"<<'\n';
int main ()
ugyldigt (* ptr) () = &cb;
principFn (cb);
fn ();
returnere 0;
Outputtet er nu,
tilbagekaldsfunktionhovedfunktion
set
Dette er også en efterligning af asynkron opførsel. Det er ikke asynkron opførsel. Det er stadig synkron opførsel. Ægte asynkron opførsel kan opnås som forklaret i næste afsnit eller med biblioteket, fremtid.
Asynkron adfærd med tilbagekaldsfunktion
Pseudokoden til den grundlæggende asynkrone tilbagekaldsfunktionsplan er:
type output;type cb (type output)
// udsagn
type principalFn (type input, type cb (type output))
// udsagn
Bemærk placeringen af input- og outputdata de forskellige steder i pseudokoden. Indgangen til tilbagekaldsfunktionen er dens output. Parameterne for hovedfunktionen er inputparameteren for den generelle kode og parameteren for tilbagekaldsfunktionen. Med denne ordning kan en tredje funktion udføres (kaldes) i hovedfunktionen () før output fra tilbagekaldsfunktionen læses (stadig i hovedfunktionen ()). Følgende kode illustrerer dette:
#omfatteved hjælp af namespace std;
char * output;
ugyldig cb (char out [])
output = ud;
void principalFn (char input [], void (* ptr) (char [50]))
(* ptr) (input);
cout<<"principal function"<<'\n';
ugyldigt fn ()
cout<<"seen"<<'\n';
int main ()
char input [] = "tilbagekaldsfunktion";
ugyldigt (* ptr) (char []) = &cb;
principFn (input, cb);
fn ();
cout<