Funkcija povratnega klica je funkcija, ki je v drugi funkciji argument in ne parameter. Drugo funkcijo lahko imenujemo glavna funkcija. Vključeni sta torej dve funkciji: glavna funkcija in sama funkcija povratnega klica. Na seznamu parametrov glavne funkcije je prisotna izjava funkcije povratnega klica brez njene definicije, tako kot so prisotne deklaracije objektov brez dodelitve. Glavna funkcija se pokliče z argumenti (v main ()). Eden od argumentov v klicu glavne funkcije je učinkovita definicija funkcije povratnega klica. V jeziku C ++ je ta argument sklic na definicijo funkcije povratnega klica; ni dejanska definicija. Sama funkcija povratnega klica je dejansko poklicana znotraj definicije glavne funkcije.
Osnovna funkcija povratnega klica v jeziku C ++ ne zagotavlja asinhronega vedenja v programu. Asinhrono vedenje je resnična korist sheme funkcij povratnega klica. V shemi asinhronih povratnih klicev je treba rezultat glavne funkcije dobiti za program, preden dobimo rezultat funkcije povratnega klica. To je mogoče storiti v jeziku C ++; vendar ima C ++ knjižnico, imenovano prihodnost, ki zagotavlja vedenje sheme asinhronih povratnih klicev.
Ta članek razlaga osnovno shemo funkcij povratnega klica. Veliko je s čistim C++. Kar zadeva povratni klic, je razloženo tudi osnovno vedenje prihodnje knjižnice. Za razumevanje tega članka je potrebno osnovno znanje C ++ in njegovih kazalcev.
Vsebina članka
- Osnovna shema funkcije povratnega klica
- Sinhrono vedenje s funkcijo povratnega klica
- Asinhrono vedenje s funkcijo povratnega klica
- Osnovna uporaba prihodnje knjižnice
- Zaključek
Osnovna shema funkcije povratnega klica
Shema funkcije povratnega klica potrebuje glavno funkcijo in samo funkcijo povratnega klica. Izjava funkcije povratnega klica je del seznama parametrov glavne funkcije. Opredelitev funkcije povratnega klica je navedena v klicu funkcije glavne funkcije. Funkcija povratnega klica se dejansko pokliče znotraj definicije glavne funkcije. Naslednji program to ponazarja:
#includeuporaba imenskega prostora std;
int principalFn (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';
vrnitev iden;
int main ()
int (* ptr) (int) = &cb;
char cha [] = "in";
glavniFn (cha, cb);
vrnitev 0;
Rezultat je:
funkcija povratnega klicaglavna funkcija: 1 in 2
Glavna funkcija je označena z principalFn (). Funkcija povratnega klica je označena s cb (). Funkcija povratnega klica je definirana zunaj glavne funkcije, vendar je dejansko poklicana znotraj glavne funkcije.
Upoštevajte izjavo funkcije povratnega klica kot parameter na seznamu parametrov izjave glavne funkcije. Izjava funkcije povratnega klica je "int (* ptr) (int)". Upoštevajte izraz funkcije povratnega klica, tako kot klic funkcije, v definiciji glavne funkcije; tam se posreduje kateri koli argument za klic funkcije povratnega klica. Stavek za ta klic funkcije je:
int idr = (* ptr) (id2);Kjer je id2 argument. ptr je del parametra, kazalec, ki bo povezan s sklicem funkcije povratnega klica v funkciji main ().
Upoštevajte izraz:
int (* ptr) (int) = &cb;V funkciji main (), ki povezuje izjavo (brez definicije) funkcije povratnega klica z imenom definicije iste funkcije povratnega klica.
Glavna funkcija se v funkciji main () imenuje kot:
glavniFn (cha, cb);Kjer je cha niz, cb pa ime funkcije povratnega klica brez katerega koli argumenta.
Sinhrono vedenje funkcije povratnega klica
Upoštevajte naslednji program:
#includeuporaba imenskega prostora std;
void principalFn (void (* ptr) ())
cout<<"principal function"<<'\n';
(* ptr) ();
void cb ()
cout<<"callback function"<<'\n';
void fn ()
cout<<"seen"<<'\n';
int main ()
void (* ptr) () = &cb;
glavniFn (cb);
fn ();
vrnitev 0;
Rezultat je:
glavna funkcijafunkcija povratnega klica
videl
Tu je nova funkcija. Vse, kar nova funkcija počne, je prikaz izhoda, "viden". V funkciji main () se pokliče glavna funkcija, nato pa nova funkcija, fn (). Izhod kaže, da je bila izvedena koda za glavno funkcijo, nato za funkcijo povratnega klica in nazadnje za funkcijo fn (). To je sinhrono (enonitno) vedenje.
Če bi šlo za asinhrono vedenje, se lahko, ko se zaporedoma pokličejo trije segmenti kode, izvede prvi odsek kode, nato pa izvajanje tretjega odseka kode, preden se izvede drugi odsek.
No, funkcijo fn () lahko pokličemo znotraj definicije glavne funkcije, namesto znotraj funkcije main (), kot sledi:
#includeuporaba imenskega prostora std;
void fn ()
cout<<"seen"<<'\n';
void principalFn (void (* ptr) ())
cout<<"principal function"<<'\n';
fn ();
(* ptr) ();
void cb ()
cout<<"callback function"<<'\n';
int main ()
void (* ptr) () = &cb;
glavniFn (cb);
vrnitev 0;
Rezultat je:
glavna funkcijavidel
funkcija povratnega klica
To je imitacija asinhronega vedenja. To ni asinhrono vedenje. Še vedno gre za sinhrono vedenje.
Tudi vrstni red izvajanja kodnega segmenta glavne funkcije in kodnega segmenta funkcije povratnega klica je mogoče v definiciji glavne funkcije zamenjati. Naslednji program to ponazarja:
#includeuporaba imenskega prostora std;
void principalFn (void (* ptr) ())
(* ptr) ();
cout<<"principal function"<<'\n';
void cb ()
cout<<"callback function"<<'\n';
void fn ()
cout<<"seen"<<'\n';
int main ()
void (* ptr) () = &cb;
glavniFn (cb);
fn ();
vrnitev 0;
Izhod je zdaj,
funkcija povratnega klicaglavna funkcija
videl
To je tudi imitacija asinhronega vedenja. To ni asinhrono vedenje. Še vedno gre za sinhrono vedenje. Resnično asinhrono vedenje je mogoče dobiti, kot je razloženo v naslednjem poglavju, ali v prihodnji knjižnici.
Asinhrono vedenje s funkcijo povratnega klica
Psevdo-koda za osnovno shemo asinhronih povratnih klicev je:
tip izhod;tip cb (izhod tipa)
// izjave
tip principalFn (vhod tipa, tip cb (izhod tipa))
// izjave
Upoštevajte položaje vhodnih in izhodnih podatkov na različnih mestih psevdo-kode. Vhod funkcije povratnega klica je njegov izhod. Parametra glavne funkcije sta vhodni parameter za splošno kodo in parameter za funkcijo povratnega klica. S to shemo lahko tretjo funkcijo izvedemo (pokličemo) v glavni () funkciji, preden izberemo funkcijo povratnega klica (še vedno v glavni () funkciji). Naslednja koda to ponazarja:
#includeuporaba imenskega prostora std;
char * izhod;
void cb (črka ven [])
izhod = ven;
void principalFn (char input [], void (* ptr) (char [50]))
(* ptr) (vnos);
cout<<"principal function"<<'\n';
void fn ()
cout<<"seen"<<'\n';
int main ()
char input [] = "funkcija povratnega klica";
void (* ptr) (char []) = &cb;
glavniFn (vhod, cb);
fn ();
cout<