Funkcija povratnega klica v C ++

Callback Function C



Funkcija povratnega klica je funkcija, ki je argument, ne parameter v drugi funkciji. Drugo funkcijo lahko imenujemo glavna funkcija. Torej sta vključeni dve funkciji: glavna funkcija in sama funkcija povratnega klica. Na seznamu parametrov glavne funkcije je prisotna deklaracija 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 C ++ je ta argument sklic na definicijo funkcije povratnega klica; to ni dejanska definicija. Funkcija povratnega klica se dejansko kliče znotraj definicije glavne funkcije.

Osnovna funkcija povratnega klica v C ++ ne zagotavlja asinhronega vedenja v programu. Asinhrono vedenje je resnična prednost sheme funkcij povratnega klica. V shemi asinhronih funkcij povratnega klica je treba za program pridobiti rezultat glavne funkcije, preden se dobi rezultat funkcije povratnega klica. To je mogoče storiti v C ++; vendar ima C ++ knjižnico, imenovano future, ki zagotavlja obnašanje asinhrone sheme funkcij povratnega klica.







Ta članek pojasnjuje osnovno shemo funkcij povratnega klica. Veliko je s čistim C ++. Kar zadeva povratni klic, je pojasnjeno tudi osnovno vedenje prihodnje knjižnice. Za razumevanje tega članka je potrebno osnovno poznavanje jezika C ++ in njegovih kazalcev.



Vsebina članka

Osnovna shema funkcij 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 v definiciji glavne funkcije. Naslednji program to ponazarja:



#vključi

z uporabo imenski prostorure;



intmainFn(charpogl[],int (*ptr)(int))

{

intid1= 1;

intid2= 2;

intponavadi= (*ptr)(id2);

stroški<<'glavna funkcija:'<<id1<<''<<pogl<<''<<ponavadi<<' n';

vrnitevid1;

}


intcb(intiden)

{

stroški<<'funkcija povratnega klica'<<' n';

vrniteviden;

}


intglavni()

{

int (*ptr)(int) = &cb;

charne[] = 'in';

mainFn(oče, cb);



vrnitev 0;

}

Izhod 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, dejansko pa se kliče znotraj glavne funkcije.

Upoštevajte deklaracijo 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; tja se posreduje kateri koli argument za klic funkcije povratnega klica. Stavek za ta klic funkcije je:



intponavadi= (*ptr)(id2);

Kjer je id2 argument. ptr je del parametra, kazalec, ki bo povezan z referenco funkcije povratnega klica v funkciji main ().

Upoštevajte izraz:

int (*ptr)(int) = &cb;

V funkciji main (), ki povezuje deklaracijo (brez definicije) funkcije povratnega klica z imenom definicije iste funkcije povratnega klica.

Glavna funkcija se v funkciji main () pokliče kot:

mainFn(oče, cb);

Kjer je cha niz in cb ime funkcije za povratni klic brez njenega argumenta.

Sinhrono vedenje funkcije povratnega klica

Razmislite o naslednjem programu:

#vključi

z uporabo imenski prostorure;



ničnomainFn(nično (*ptr)())

{

stroški<<'glavna funkcija'<<' n';

(*ptr)();

}


ničnocb()

{

stroški<<'funkcija povratnega klica'<<' n';

}


ničnofn()

{

stroški<<'videno'<<' n';

}


intglavni()

{

nično (*ptr)() = &cb;

mainFn(cb);

fn();



vrnitev 0;

}

Izhod je:

glavna funkcija

funkcija povratnega klica

videno

Tu je nova funkcija. Vse, kar nova funkcija počne, je prikazati izhod, viden. V funkciji main () se pokliče glavna funkcija, nato se pokliče nova funkcija, fn (). Izhod prikazuje, 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, ko se pokličejo trije kodni segmenti, se lahko izvede prvi kodni segment, ki mu sledi izvedba tretjega kodnega segmenta, preden se izvede drugi kodni segment.

No, funkcijo fn () je mogoče poklicati znotraj definicije glavne funkcije, namesto znotraj funkcije main (), kot sledi:

#vključi

z uporabo imenski prostorure;



ničnofn()

{

stroški<<'videno'<<' n';

}


ničnomainFn(nično (*ptr)())

{

stroški<<'glavna funkcija'<<' n';

fn();

(*ptr)();

}


ničnocb()

{

stroški<<'funkcija povratnega klica'<<' n';

}


intglavni()

{

nično (*ptr)() = &cb;

mainFn(cb);



vrnitev 0;

}

Izhod je:

glavna funkcija

videno

funkcija povratnega klica

To je imitacija asinhronega vedenja. To ni asinhrono vedenje. Še vedno gre za sinhrono vedenje.

Prav tako se lahko vrstni red izvajanja kodnega segmenta glavne funkcije in kodnega segmenta funkcije povratnega klica zamenja v definiciji glavne funkcije. Naslednji program to ponazarja:

#vključi

z uporabo imenski prostorure;



ničnomainFn(nično (*ptr)())

{

(*ptr)();

stroški<<'glavna funkcija'<<' n';

}


ničnocb()

{

stroški<<'funkcija povratnega klica'<<' n';

}


ničnofn()

{

stroški<<'videno'<<' n';

}


intglavni()

{

nično (*ptr)() = &cb;

mainFn(cb);

fn();



vrnitev 0;

}

Izhod je zdaj,

funkcija povratnega klica

glavna funkcija

videno

To je tudi imitacija asinhronega vedenja. To ni asinhrono vedenje. Še vedno gre za sinhrono vedenje. Pravo asinhrono vedenje je mogoče pridobiti, kot je razloženo v naslednjem razdelku, ali s knjižnico, prihodnost.

Asinhrono vedenje s funkcijo povratnega klica

Psevdo koda za osnovno shemo funkcij asinhronega povratnega klica je:

tip izhoda;

tip cb(tip izhoda)

{

// izjave

}


vrsta principalFn(tip vhod, tip cb(tip izhoda))

{

// izjave

}

Upoštevajte položaje vhodnih in izhodnih podatkov na različnih mestih psevdo kode. Vhod funkcije povratnega klica je njen izhod. Parametri glavne funkcije so vhodni parameter za splošno kodo in parameter za funkcijo povratnega klica. S to shemo se lahko izvede tretja funkcija (klic) v funkciji main (), preden se prebere izhod funkcije povratnega klica (še vedno v funkciji main ()). Naslednja koda ponazarja to:

#vključi

z uporabo imenski prostorure;

char *izhod;


ničnocb(charven[])

{

izhod=ven;

}



ničnomainFn(charvnos[],nično (*ptr)(char[petdeset]))

{

(*ptr)(vnos);

stroški<<'glavna funkcija'<<' n';

}


ničnofn()

{

stroški<<'videno'<<' n';

}


intglavni()

{

charvnos[] = 'funkcija povratnega klica';

nično (*ptr)(char[]) = &cb;

mainFn(vhod, cb);

fn();

stroški<<izhod<<' n';



vrnitev 0;

}

Izhod programa je:

glavna funkcija

videno

funkcija povratnega klica

V tej posebni kodi sta izhodna in vhodna referenca enaka referenčna točka. Rezultat klica tretje funkcije v funkciji main () je bil prikazan pred rezultatom funkcije povratnega klica. Funkcija povratnega klica se je izvedla, končala in svojemu rezultatu (vrednosti) dodelila spremenljivko output, kar omogoča nadaljevanje programa brez motenj. V funkciji main () je bil izhod funkcije povratnega klica uporabljen (prebran in prikazan), ko je bil potreben, kar je privedlo do asinhronega vedenja za celotno shemo.

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

Osnovna uporaba prihodnje knjižnice

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

Upoštevajte zgornjo kodo, da funkcija povratnega klica sprejme glavni vhod za kodo in proizvede glavni izhod za kodo. Prihodnja knjižnica C ++ ima funkcijo, imenovano sync (). Prvi argument te funkcije je sklic na funkcijo povratnega klica; drugi argument je vnos v funkcijo povratnega klica. Funkcija sync () se vrne, ne da bi čakala, da se izvede funkcija povratnega klica, vendar omogoča, da se funkcija povratnega klica dokonča. To zagotavlja asinhrono vedenje. Medtem ko se funkcija povratnega klica še naprej izvaja, ker se je funkcija sync () že vrnila, se stavki pod njo nadaljujejo. To je kot idealno asinhrono vedenje.

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

#vključi

#vključi

#vključi

z uporabo imenski prostorure;

prihodnost<vrvica>izhod;

niz cb(niza stri)

{

vrnitevstri;

}



ničnomainFn(vnos niza)

{

izhod=async(cb, vhod);

stroški<<'glavna funkcija'<<' n';

}


ničnofn()

{

stroški<<'videno'<<' n';

}


intglavni()

{

vnos niza=vrvica('funkcija povratnega klica');

mainFn(vnos);

fn();

niz ret=izhod.dobiti(); // počaka, da se povratni klic vrne, če je potrebno

stroški<<prav<<' n';



vrnitev 0;

}

Funkcija sync () končno shrani izhod funkcije povratnega klica v bodoči objekt. Pričakovani izid je mogoče dobiti v funkciji main () s pomočjo članske funkcije get () bodočega predmeta.

Zaključek

Funkcija povratnega klica je funkcija, ki je argument, ne parameter v drugi funkciji. 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 v definiciji glavne funkcije.

Shema funkcije povratnega klica ni nujno asinhrona. Če želite zagotoviti, da je shema funkcije povratnega klica asinhrona, vnesite glavni vnos v kodo, vnesite funkcijo povratnega klica; naredite glavni izhod kode, izhod funkcije povratnega klica; shranite izhod funkcije povratnega klica v spremenljivko ali podatkovno strukturo. V funkciji main () po klicu glavne funkcije izvedite druge stavke aplikacije. Ko je potreben izhod funkcije povratnega klica, jo v funkciji main () uporabite (preberite in prikažite) tam in potem.