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 skambinimo funkcijų schema
- Sinchroninis elgesys su atgalinio ryšio funkcija
- Asinchroninis elgesys su atgalinio ryšio funkcija
- Pagrindinis būsimos bibliotekos naudojimas
- Išvada
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:
# įtrauktinaudojant vardų sritį std;
int pagrindinisFn (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';
grįžti iden;
int main ()
int (* ptr) (int) = &cb;
char cha [] = "ir";
pagrindinisFn (cha, cb);
grąžinti 0;
Rezultatas yra:
atgalinio skambinimo funkcijapagrindinė 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ą:
# įtrauktinaudojant 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ė funkcijaatgalinio 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:
# įtrauktinaudojant 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ė funkcijamatė
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:
# įtrauktinaudojant 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 funkcijapagrindinė 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:
# įtrauktinaudojant 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<