C ++

Funkcija povratnega klica v C ++

Funkcija povratnega klica v C ++

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

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:

#include
uporaba imenskega prostora std;
int principalFn (char ch [], int (* ptr) (int))

int id1 = 1;
int id2 = 2;
int idr = (* ptr) (id2);
cout<<"principal function: "<vrni id1;

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 klica
glavna 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:

#include
uporaba 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 funkcija
funkcija 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:

#include
uporaba 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 funkcija
videl
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:

#include
uporaba 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 klica
glavna 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:

#include
uporaba 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<vrnitev 0;

Rezultat programa je:

glavna funkcija
videl
funkcija povratnega klica

V tej posebni kodi je izhodna in vhodna referenčna točka enaka referenčni točki. Rezultat tretjega klica funkcije v glavni () funkciji je bil prikazan pred rezultatom funkcije povratnega klica. Funkcija povratnega klica je bila izvedena, zaključena in je spremenljivki, izhodu, dodelila rezultat (vrednost), kar omogoča nadaljevanje programa brez motenj. V glavni () funkciji je bil uporabljen izhod funkcije povratnega klica (branje in prikaz), ko je bila potrebna, kar je povzročilo asinhrono vedenje celotne sheme.

To je enonitni način za pridobitev asinhronega vedenja funkcije povratnega klica s čistim C++.

Osnovna uporaba prihodnje knjižnice

Ideja sheme asinhrone funkcije povratnega klica je, da se glavna funkcija vrne, preden se vrne funkcija povratnega klica. To je bilo storjeno posredno, učinkovito v zgornji kodi.

Iz zgornje kode upoštevajte, da funkcija povratnega klica prejme glavni vhod za kodo in ustvari glavni izhod za kodo. Knjižnica C ++, prihodnost, ima funkcijo, imenovano sync (). Prvi argument te funkcije je referenca funkcije povratnega klica; drugi argument je vhod v funkcijo povratnega klica. Funkcija sync () se vrne, ne da bi čakala, da se izvrši funkcija povratnega klica, vendar omogoča dokončanje funkcije povratnega klica. To zagotavlja asinhrono vedenje. Medtem ko se funkcija povratnega klica še naprej izvaja, ker se je funkcija sync () že vrnila, se stavki pod njo še naprej izvajajo. To je kot idealno asinhrono vedenje.

Zgornji program je bil spodaj napisan ob upoštevanju prihodnje knjižnice in njene funkcije sinhronizacije ():

#include
#include
#include
uporaba imenskega prostora std;
prihodnosti izhod;
niz cb (niz stri)

vrnitev stri;

void principalFn (niz vnosa)

output = async (cb, input);
cout<<"principal function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

string input = string ("funkcija povratnega klica");
glavniFn (vhod);
fn ();
niz ret = izhod.get (); // počaka, da se po potrebi vrne povratni klic
cout<vrnitev 0;

Funkcija sync () končno shrani izhod funkcije povratnega klica v prihodnji objekt. Pričakovani izhod je mogoče dobiti v glavni () funkciji z uporabo funkcije člana (() prihodnjega predmeta.

Zaključek

Funkcija povratnega klica je funkcija, ki je v drugi funkciji argument in ne parameter. 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 (v main ()). Funkcija povratnega klica se dejansko pokliče znotraj definicije glavne funkcije.

Shema funkcij povratnega klica ni nujno asinhrona. Če želite biti prepričani, da je shema funkcij povratnega klica asinhrona, vnesite glavni vnos v kodo, vhod v funkcijo povratnega klica; naredite glavni izhod kode, izhod funkcije povratnega klica; shrani izhod funkcije povratnega klica v spremenljivko ali podatkovno strukturo. V funkciji main () po klicu glavne funkcije izvršite druge stavke aplikacije. Ko je potreben izhod funkcije povratnega klica, jo v glavni () funkciji uporabite (preberite in prikažite) tam in tam.

Kazalec skoči ali se naključno premika med tipkanjem v sistemu Windows 10
Če ugotovite, da kazalec miške med tipkanjem v prenosnem računalniku ali računalniku Windows samodejno, naključno preskakuje ali se premika sam, vam l...
Kako obrniti smer drsenja miške in sledilne ploščice v sistemu Windows 10
Miška in Sledilna ploščicaRačunalništvo ni samo enostavno, ampak bolj učinkovito in manj zamudno. Življenja brez teh naprav si ne moremo predstavljati...
Kako spremeniti miškin kazalec in velikost, barvo in shemo kazalca v sistemu Windows 10
Kazalec miške in kazalec v operacijskem sistemu Windows 10 sta zelo pomembna vidika operacijskega sistema. To lahko rečemo tudi za druge operacijske s...