C ++

Skambinimo funkcija C ++

Skambinimo funkcija C ++

Grąžinimo funkcija yra funkcija, kuri yra argumentas, o ne parametras kitoje funkcijoje. Kita funkcija gali būti vadinama pagrindine funkcija. Taigi yra dvi funkcijos: pagrindinė funkcija ir pati atgalinio ryšio funkcija. Pagrindinės funkcijos parametrų sąraše yra atgalinio skambučio funkcijos deklaracija be jos apibrėžimo, kaip ir objekto deklaracijos be priskyrimo. Pagrindinė funkcija iškviečiama argumentais (in main ()). Vienas iš pagrindinių funkcijų iškvietimo argumentų yra veiksmingas atgalinio skambučio funkcijos apibrėžimas. C ++, šis argumentas yra nuoroda į atgalinio skambučio funkcijos apibrėžimą; tai nėra tikrasis apibrėžimas. Pati skambinimo funkcija iš tikrųjų yra iškviečiama apibrėžiant pagrindinę funkciją.

Pagrindinė C ++ skambinimo funkcija negarantuoja asinchroninio elgesio programoje.  Asinchroninis elgesys yra tikroji atgalinio ryšio funkcijos schemos nauda. Asinchroninės atgalinio skambučio funkcijos schemoje programos pagrindinės funkcijos rezultatas turėtų būti gautas prieš gaunant atgalinio skambinimo funkcijos rezultatą. Tai galima padaryti C ++; tačiau C ++ turi biblioteką, vadinamą ateitimi, užtikrinančia asinchroninės atgalinio skambinimo funkcijos schemos veikimą.

Šiame straipsnyje paaiškinama pagrindinė atgalinio skambinimo funkcijos schema. Daug jo yra su grynu C++. Kalbant apie atgalinį skambutį, taip pat paaiškinamas pagrindinis būsimos bibliotekos elgesys. Pagrindinės žinios apie C ++ ir jo rodykles yra būtinos norint suprasti šį straipsnį.

Straipsnio turinys

Pagrindinė atgalinio skambėjimo funkcijų schema

Atgalinio skambučio funkcijos schemai reikia pagrindinės funkcijos ir pačios atgalinio skambinimo funkcijos. Grąžinimo funkcijos deklaravimas yra pagrindinės funkcijos parametrų sąrašo dalis. Atgalinio skambučio funkcijos apibrėžimas nurodomas pagrindinės funkcijos funkcijos iškvietime. Atgalinio skambinimo funkcija iš tikrųjų iškviečiama apibrėžiant pagrindinę funkciją. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
int pagrindinisFn (char ch [], int (* ptr) (int))

int id1 = 1;
int id2 = 2;
int idr = (* ptr) (id2);
cout<<"principal function: "<grąžinimo id1;

int cb (int iden)

cout<<"callback function"<<'\n';
grįžti iden;

int main ()

int (* ptr) (int) = &cb;
char cha [] = "ir";
pagrindinisFn (cha, cb);
grąžinti 0;

Rezultatas yra:

atgalinio skambinimo funkcija
pagrindinė funkcija: 1 ir 2

Pagrindinę funkciją identifikuoja principasFn (). Atgalinio skambučio funkciją identifikuoja cb (). Atgalinio skambučio funkcija yra apibrėžta už pagrindinės funkcijos ribų, tačiau iš tikrųjų iškviečiama pagrindinės funkcijos metu.

Atkreipkite dėmesį į atgalinės funkcijos deklaraciją kaip parametrą į pagrindinės funkcijos deklaracijos parametrų sąrašą. Atgalinio skambučio funkcijos deklaracija yra „int (* ptr) (int)“. Pagrindinės funkcijos apibrėžime atkreipkite dėmesį į atgalinio skambėjimo funkcijos išraišką, kaip ir funkcijos iškvietimą; ten perduodamas bet kuris atgalinio skambučio funkcijos iškvietimo argumentas. Šio funkcijos iškvietimo teiginys yra:

int idr = (* ptr) (id2);

Kur id2 yra argumentas. ptr yra parametro dalis, rodyklė, kuri bus susieta su atgalinio skambinimo funkcijos nuoroda pagrindinėje () funkcijoje.

Atkreipkite dėmesį į išraišką:

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

Funkcijoje main (), kuri susieja atgalinio skambėjimo funkcijos deklaraciją (be apibrėžimo) su tos pačios atgalinio skambučio funkcijos apibrėžimo pavadinimu.

Pagrindinė funkcija pagrindinėje () funkcijoje vadinama taip:

pagrindinisFn (cha, cb);

Kur cha yra eilutė, o cb yra atgalinio skambinimo funkcijos pavadinimas be jokio jos argumento.

Sinchroninis atgalinio skambučio funkcijos elgesys

Apsvarstykite šią programą:

# įtraukti
naudojant vardų sritį std;
negaliojanti pagrindinėFn (negaliojanti (* ptr) ())

cout<<"principal function"<<'\n';
(* ptr) ();

negaliojantis cb ()

cout<<"callback function"<<'\n';

anuliuoti fn ()

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

int main ()

tuštuma (* ptr) () = &cb;
pagrindinisFn (cb);
fn ();
grąžinti 0;

Rezultatas yra:

pagrindinė funkcija
atgalinio skambinimo funkcija
matė

Čia yra nauja funkcija. Visa nauja funkcija yra rodyti išvestį, „matytą“. Pagrindinėje () funkcijoje iškviečiama pagrindinė funkcija, paskui iškviečiama naujoji funkcija fn (). Išvestis rodo, kad buvo įvykdytas pagrindinės funkcijos kodas, tada buvo įvykdytas atgalinio skambinimo funkcijos kodas ir galiausiai buvo atlikta funkcija fn (). Tai sinchroniškas (vienos gijos) elgesys.

Jei tai būtų asinchroninis elgesys, kai pakviečiami trys kodo segmentai, prieš vykdant antrąjį kodo segmentą, gali būti įvykdytas pirmasis kodo segmentas, o po to - trečiojo kodo segmento vykdymas.

Na, funkciją fn () galima iškviesti iš pagrindinės funkcijos apibrėžimo, o ne iš pagrindinės () funkcijos taip:

# įtraukti
naudojant vardų sritį std;
anuliuoti fn ()

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

negaliojanti pagrindinėFn (negaliojanti (* ptr) ())

cout<<"principal function"<<'\n';
fn ();
(* ptr) ();

negaliojantis cb ()

cout<<"callback function"<<'\n';

int main ()

tuštuma (* ptr) () = &cb;
pagrindinisFn (cb);
grąžinti 0;

Rezultatas yra:

pagrindinė funkcija
matė
atgalinio skambinimo funkcija

Tai yra asinchroninio elgesio imitacija. Tai nėra asinchroninis elgesys. Tai vis dar yra sinchroniškas elgesys.

Be to, pagrindinės funkcijos kodo segmento ir atgalinio skambinimo funkcijos kodo segmento vykdymo tvarką galima pakeisti pagrindinės funkcijos apibrėžimu. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
 
negaliojanti pagrindinėFn (negaliojanti (* ptr) ())

(* ptr) ();
cout<<"principal function"<<'\n';

negaliojantis cb ()

cout<<"callback function"<<'\n';

anuliuoti fn ()

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

int main ()

tuštuma (* ptr) () = &cb;
pagrindinisFn (cb);
fn ();
grąžinti 0;

Išvestis yra dabar,

atgalinio skambinimo funkcija
pagrindinė funkcija
matė

Tai taip pat yra asinchroninio elgesio imitacija. Tai nėra asinchroninis elgesys. Tai vis dar yra sinchroniškas elgesys. Tikrą asinchroninį elgesį galima gauti, kaip paaiškinta kitame skyriuje, arba su biblioteka, ateitis.

Asinchroninis elgesys su atgalinio ryšio funkcija

Pagrindinės asinchroninės atgalinio skambinimo funkcijos schemos pseudo kodas yra:

tipo išvestis;
tipas cb (tipo išvestis)

// teiginiai

type pagrindinisFn (tipo įvestis, tipo cb (tipo išvestis))

// teiginiai

Atkreipkite dėmesį į įvesties ir išvesties duomenų pozicijas skirtingose ​​pseudokodo vietose. Atgalinio skambučio funkcijos įvestis yra jos išvestis. Pagrindinės funkcijos parametrai yra bendrojo kodo įvesties parametras ir atgalinio ryšio funkcijos parametras. Naudojant šią schemą, prieš nuskaitant atgalinės funkcijos išvestį (vis dar yra pagrindinė () funkcija), pagrindinėje () funkcijoje galima atlikti (iškviesti) trečiąją funkciją. Tai iliustruoja šis kodas:

# įtraukti
naudojant vardų sritį std;
char * išėjimas;
negaliojanti cb (char out [])

išėjimas = išėjimas;

negaliojanti pagrindinėFn (char įvestis [], void (* ptr) (char [50]))

(* ptr) (įvestis);
cout<<"principal function"<<'\n';

anuliuoti fn ()

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

int main ()

char input [] = "skambinimo funkcija";
tuštuma (* ptr) (char []) = &cb;
pagrindinisFn (įvestis, cb);
fn ();
cout<grąžinti 0;

Programos išvestis yra:

pagrindinė funkcija
matė
atgalinio skambinimo funkcija

Šiame konkrečiame kode išvesties ir įvesties atskaitos taškai būna tie patys. Trečiojo pagrindinės () funkcijos iškvietimo rezultatas buvo parodytas prieš atgalinio skambinimo funkcijos rezultatą. Atgalinio skambinimo funkcija įvykdė, užbaigė ir priskyrė savo rezultatą (vertę) kintamajam, išėjimui, leidžiantį programą tęsti be jos trukdžių. Pagrindinėje () funkcijoje atgalinio ryšio funkcija buvo naudojama (perskaityta ir rodoma), kai to prireikė, todėl asinchroninis visos schemos elgesys.

Tai yra vienos gijos būdas gauti atgalinio skambinimo funkcijos asinchroninį elgesį su grynu C++.

Pagrindinis būsimos bibliotekos naudojimas

Asinchroninės atgalinio skambučio funkcijos schemos idėja yra ta, kad pagrindinė funkcija grįžta prieš grįžtamojo ryšio funkciją. Tai buvo padaryta netiesiogiai, efektyviai, aukščiau pateiktame kode.

Atkreipkite dėmesį iš aukščiau nurodyto kodo, kad atgalinio ryšio funkcija gauna pagrindinį kodo įvedimą ir sukuria pagrindinį kodo išėjimą. „C ++“ biblioteka „future“ turi funkciją, vadinamą sync (). Pirmasis šios funkcijos argumentas yra atgalinio skambinimo funkcijos nuoroda; antrasis argumentas yra atgalinio skambučio funkcijos įvestis. Sinchronizavimo () funkcija grįžta nelaukdama, kol bus baigta atgalinio skambučio funkcija, tačiau leidžia atlikti atgalinio skambinimo funkciją. Tai suteikia asinchroninį elgesį. Nors atgalinio ryšio funkcija ir toliau vykdoma, nes sinchronizavimo () funkcija jau grįžo, toliau pateikiami teiginiai toliau vykdomi. Tai panašu į idealų asinchroninį elgesį.

Pirmiau nurodyta programa buvo perrašyta žemiau, atsižvelgiant į būsimą biblioteką ir jos sinchronizavimo () funkciją:

# įtraukti
# įtraukti
# įtraukti
naudojant vardų sritį std;
ateityje išvestis;
eilutė cb (styginių juosta)

grįžimo juosta;

negaliojanti pagrindinėFn (eilutės įvestis)

išvestis = asinchroninis (cb, įvestis);
cout<<"principal function"<<'\n';

anuliuoti fn ()

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

int main ()

eilutės įvestis = eilutė („atgalinio skambinimo funkcija“);
pagrindinisFn (įvestis);
fn ();
eilutė ret = išvestis.gauti (); // prireikus laukia, kol grįš atgalinis skambutis
cout<grąžinti 0;

Sinchronizavimo () funkcija pagaliau išsaugo atgalinio skambučio funkcijos išvestį į būsimą objektą. Laukiamą rezultatą galima gauti naudojant pagrindinę () funkciją, naudojant būsimo objekto funkciją get ().

Išvada

Grąžinimo funkcija yra funkcija, kuri yra argumentas, o ne parametras kitoje funkcijoje. Atgalinio skambučio funkcijos schemai reikalinga pagrindinė funkcija ir pati atgalinio ryšio funkcija. Grąžinimo funkcijos deklaravimas yra pagrindinės funkcijos parametrų sąrašo dalis. Atgalinio skambučio funkcijos apibrėžimas nurodomas pagrindinės funkcijos funkcijos iškvietime (pagrindiniame ()). Atgalinio skambinimo funkcija iš tikrųjų iškviečiama apibrėžiant pagrindinę funkciją.

Skambinimo funkcijos schema nebūtinai yra asinchroninė. Norėdami įsitikinti, kad atgalinio skambinimo funkcijos schema yra asinchroninė, atlikite pagrindinį kodo įvestį, atgalinio skambinimo funkcijos įvestį; padaryti pagrindinę kodo išvestį, atgalinio skambinimo funkcijos išvestį; išsaugokite atgalinio skambinimo funkcijos išvestį kintamajame arba duomenų struktūroje. Pagrindinėje () funkcijoje, iškvietę pagrindinę funkciją, vykdykite kitus programos sakinius. Kai reikalinga atgalinio skambučio funkcijos išvestis, pagrindinėje () funkcijoje ją naudokite (skaitykite ir atvaizduokite).

Pridėkite pelės gestus prie „Windows 10“ naudodami šiuos nemokamus įrankius
Pastaraisiais metais kompiuteriai ir operacinės sistemos labai išsivystė. Buvo laikas, kai vartotojai turėjo naudoti komandas naršydami per failų tvar...
Valdykite ir valdykite pelės judėjimą tarp kelių „Windows 10“ monitorių
„Dual Display Mouse Manager“ leidžia jums valdyti ir konfigūruoti pelės judėjimą tarp kelių monitorių, sulėtinant jo judėjimą šalia sienos. „Windows 1...
„WinMouse“ leidžia tinkinti ir pagerinti pelės žymeklio judėjimą „Windows“ kompiuteryje
Jei norite pagerinti numatytąsias pelės žymiklio funkcijas, naudokite nemokamą programinę įrangą „WinMouse“. Tai prideda daugiau funkcijų, kurios padė...