C ++

Atzvana funkcija C ++

Atzvana funkcija C ++

Atzvana funkcija ir funkcija, kas ir arguments, nevis parametrs citā funkcijā. Otru funkciju var saukt par galveno funkciju. Tātad ir iesaistītas divas funkcijas: galvenā funkcija un pati atzvanīšanas funkcija. Galvenās funkcijas parametru sarakstā ir atzvanīšanas funkcijas deklarācija bez tās definīcijas, tāpat kā objektu deklarācijas bez piešķiršanas. Galvenā funkcija tiek izsaukta ar argumentiem (galvenajā ()). Viens no galvenās funkcijas izsaukuma argumentiem ir efektīva atzvanīšanas funkcijas definīcija. Programmā C ++ šis arguments ir atsauce uz atzvanīšanas funkcijas definīciju; tā nav faktiskā definīcija. Pati atzvanīšanas funkcija faktiski tiek izsaukta galvenās funkcijas definīcijā.

C ++ pamata atzvanīšanas funkcija negarantē asinhronu uzvedību programmā.  Asinhronā uzvedība ir atzvanīšanas funkciju shēmas patiesais ieguvums. Asinhronās atzvanīšanas funkcijas shēmā programmas galvenās funkcijas rezultāts jāiegūst, pirms tiek iegūts atzvanīšanas funkcijas rezultāts. To ir iespējams izdarīt C ++; tomēr C ++ ir bibliotēka, ko sauc par nākotni, lai garantētu asinhronās atzvanīšanas funkciju shēmas darbību.

Šajā rakstā ir izskaidrota galvenā atzvanīšanas funkcijas shēma. Daudz tas ir ar tīru C++. Kas attiecas uz atzvanīšanu, tiek izskaidrota arī topošās bibliotēkas pamata uzvedība. Šī raksta izpratnei ir nepieciešamas pamatzināšanas par C ++ un tās norādēm.

Raksta saturs

Galvenā atzvanīšanas funkciju shēma

Atzvana funkciju shēmai ir nepieciešama galvenā funkcija un pati atzvanīšanas funkcija. Atzvana funkcijas deklarācija ir daļa no galvenās funkcijas parametru saraksta. Atzvana funkcijas definīcija ir norādīta galvenās funkcijas funkciju izsaukumā. Atzvana funkcija faktiski tiek izsaukta galvenās funkcijas definīcijā. To ilustrē šāda programma:

# iekļaut
izmantojot nosaukumvietu std;
int principsFn (char ch [], int (* ptr) (int))

int id1 = 1;
int id2 = 2;
int idr = (* ptr) (id2);
cout<<"principal function: "<atgriešanās id1;

int cb (int iden)

cout<<"callback function"<<'\n';
atgriešanās iden;

int main ()

int (* ptr) (int) = &cb;
char cha [] = "un";
galvenaisFn (cha, cb);
atgriešanās 0;

Rezultāts ir:

atzvanīšanas funkcija
galvenā funkcija: 1 un 2

Galveno funkciju identificē ar principuFn (). Atzvana funkciju identificē ar cb (). Atzvana funkcija tiek definēta ārpus galvenās funkcijas, bet faktiski tiek izsaukta galvenās funkcijas ietvaros.

Atzvana funkcijas deklarāciju kā parametru ņemiet vērā galvenās funkcijas deklarācijas parametru sarakstā. Atzvana funkcijas deklarācija ir “int (* ptr) (int)”. Atzvana funkcijas izteiksmi, tāpat kā funkcijas izsaukumu, ņemiet vērā galvenās funkcijas definīcijā; tur tiek nodots jebkurš arguments par atzvanīšanas funkcijas izsaukumu. Izraksts par šo funkciju izsaukumu ir:

int idr = (* ptr) (id2);

Kur id2 ir arguments. ptr ir daļa no parametra, rādītājs, kas tiks saistīts ar atsaukšanas funkcijas atsauci galvenajā () funkcijā.

Ievērojiet izteicienu:

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

Funkcijā main (), kas saista atzvanīšanas funkcijas deklarāciju (bez definīcijas) ar tās pašas atzvanīšanas funkcijas definīcijas nosaukumu.

Galveno funkciju galvenajā () funkcijā sauc par:

galvenaisFn (cha, cb);

Kur cha ir virkne un cb ir atzvanīšanas funkcijas nosaukums bez tā argumentiem.

Sinhronā atzvanīšanas funkcijas darbība

Apsveriet šādu programmu:

# iekļaut
izmantojot nosaukumvietu std;
void principālsFn (void (* ptr) ())

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

anulēt cb ()

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

anulēt fn ()

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

int main ()

void (* ptr) () = &cb;
galvenaisFn (cb);
fn ();
atgriešanās 0;

Rezultāts ir:

galvenā funkcija
atzvanīšanas funkcija
redzēts

Šeit ir jauna funkcija. Jaunā funkcija ir parādīt “redzēto” izvadi. Main () funkcijā tiek izsaukta galvenā funkcija, pēc tam tiek izsaukta jaunā funkcija fn (). Izeja parāda, ka tika izpildīts galvenās funkcijas kods, pēc tam tika izpildīts atzvanīšanas funkcijas kods un, visbeidzot, ka tika izpildīta funkcija fn (). Tā ir sinhrona (viena pavediena) uzvedība.

Ja tā bija asinhrona darbība, kad tiek saukti secīgi trīs koda segmenti, pirms otrā koda segmenta izpildes var izpildīt pirmo koda segmentu, kam seko trešā koda segmenta izpilde.

Funkciju fn () var izsaukt no galvenās funkcijas definīcijas, nevis no galvenās () funkcijas šādi:

# iekļaut
izmantojot nosaukumvietu std;
anulēt fn ()

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

void principālsFn (void (* ptr) ())

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

anulēt cb ()

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

int main ()

void (* ptr) () = &cb;
galvenaisFn (cb);
atgriešanās 0;

Rezultāts ir:

galvenā funkcija
redzēts
atzvanīšanas funkcija

Tas ir asinhronas uzvedības imitācija. Tā nav asinhrona uzvedība. Tā joprojām ir sinhrona uzvedība.

Arī galvenās funkcijas koda segmenta un atzvanīšanas funkcijas koda segmenta izpildes secību var mainīt galvenās funkcijas definīcijā. To ilustrē šāda programma:

# iekļaut
izmantojot nosaukumvietu std;
 
void principālsFn (void (* ptr) ())

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

anulēt cb ()

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

anulēt fn ()

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

int main ()

void (* ptr) () = &cb;
galvenaisFn (cb);
fn ();
atgriešanās 0;

Rezultāts ir tagad,

atzvanīšanas funkcija
galvenā funkcija
redzēts

Tas ir arī asinhronas uzvedības imitācija. Tā nav asinhrona uzvedība. Tā joprojām ir sinhrona uzvedība. Patiesu asinhrono uzvedību var iegūt, kā paskaidrots nākamajā sadaļā vai ar bibliotēku, nākotni.

Asinhrona uzvedība ar atzvanīšanas funkciju

Asinhronās atzvanīšanas pamata shēmas pseidokods ir:

tipa izeja;
tips cb (tipa izvade)

//paziņojumi

type basicFn (tipa ievade, tipa cb (tipa izvade))

//paziņojumi

Ievērojiet ievades un izvades datu pozīcijas dažādās pseidokoda vietās. Atzvana funkcijas ievade ir tā izeja. Galvenās funkcijas parametri ir vispārējā koda ievades parametrs un atzvanīšanas funkcijas parametrs. Izmantojot šo shēmu, galveno () funkciju var izpildīt (izsaukt) trešo funkciju, pirms tiek nolasīta atzvanīšanas funkcijas izeja (joprojām galvenā () funkcija). Šis kods ilustrē to:

# iekļaut
izmantojot nosaukumvietu std;
char * izeja;
void cb (char out [])

izeja = ārā;

void basicFn (char ievade [], void (* ptr) (char [50]))

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

anulēt fn ()

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

int main ()

char input [] = "atzvanīšanas funkcija";
void (* ptr) (char []) = &cb;
galvenaisFn (ievade, cb);
fn ();
cout<atgriešanās 0;

Programmas rezultāts ir:

galvenā funkcija
redzēts
atzvanīšanas funkcija

Šajā konkrētajā kodā izejas un ievades atskaites punkts ir viens un tas pats. Galvenās () funkcijas trešās funkcijas izsaukuma rezultāts ir parādīts pirms atzvanīšanas funkcijas rezultāta. Atzvana funkcija izpildīja, pabeidza un piešķīra rezultātu (vērtību) mainīgajam, output, ļaujot programmai turpināt darbu bez tās iejaukšanās. Main () funkcijā atzvanīšanas funkcijas izeja tika izmantota (lasīta un parādīta), kad tā bija nepieciešama, izraisot asinhronu uzvedību visai shēmai.

Tas ir viena pavediena veids, kā iegūt atzvanīšanas funkcijas asinhrono uzvedību ar tīru C++.

Topošās bibliotēkas pamata izmantošana

Asinhronās atzvanīšanas funkcijas shēmas ideja ir tāda, ka galvenā funkcija atgriežas pirms atzvanīšanas funkcijas atgriešanās. Tas tika izdarīts netieši, efektīvi, iepriekš minētajā kodeksā.

No iepriekš minētā koda ņemiet vērā, ka atzvanīšanas funkcija saņem galveno koda ievadi un ģenerē galveno koda izvadi. Nākotnes C ++ bibliotēkai ir funkcija ar nosaukumu sync (). Pirmais šīs funkcijas arguments ir atsaukšanas funkcijas atsauce; otrais arguments ir atzvanīšanas funkcijas ievade. Sinhronizācijas () funkcija atgriežas, negaidot, kamēr tiks pabeigta atzvanīšanas funkcija, bet ļauj pabeigt atzvanīšanas funkciju. Tas nodrošina asinhronu uzvedību. Kaut arī atzvanīšanas funkcija turpina darboties, tā kā funkcija sync () jau ir atgriezusies, zem tās esošie paziņojumi turpina izpildīt. Tas ir kā ideāla asinhrona uzvedība.

Iepriekš minētā programma ir pārrakstīta zemāk, ņemot vērā nākotnes bibliotēku un tās sinhronizācijas () funkciju:

# iekļaut
# iekļaut
# iekļaut
izmantojot nosaukumvietu std;
nākotnē izeja;
virkne cb (virkne sloksne)

atgriešanās sloksne;

void basicFn (virknes ievade)

izeja = asinhronais (cb, ievade);
cout<<"principal function"<<'\n';

anulēt fn ()

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

int main ()

virknes ievade = virkne ("atzvanīšanas funkcija");
galvenaisFn (ievade);
fn ();
virkne ret = izeja.gūt(); // vajadzības gadījumā gaida atzvanīšanu
cout<atgriešanās 0;

Sinhronizācijas () funkcija beidzot saglabā atzvanīšanas funkcijas izvadi nākotnes objektā. Paredzēto rezultātu var iegūt galvenajā () funkcijā, izmantojot nākotnes objekta funkciju get ().

Secinājums

Atzvana funkcija ir funkcija, kas ir arguments, nevis parametrs citā funkcijā. Atzvana funkciju shēmai ir nepieciešama galvenā funkcija un pati atzvanīšanas funkcija. Atzvana funkcijas deklarācija ir daļa no galvenās funkcijas parametru saraksta. Atzvana funkcijas definīcija ir norādīta galvenās funkcijas funkciju izsaukumā (galvenajā ()). Atzvana funkcija faktiski tiek izsaukta galvenās funkcijas definīcijā.

Atzvana funkcijas shēma nav obligāti asinhrona. Lai pārliecinātos, ka atzvanīšanas funkcijas shēma ir asinhrona, veiciet koda galveno ievadi, atzvanīšanas funkcijas ievadi; veikt koda galveno izvadi, atzvanīšanas funkcijas izvadi; saglabājiet atzvanīšanas funkcijas izvadi mainīgajā vai datu struktūrā. Main () funkcijā pēc galvenās funkcijas izsaukšanas izpildiet citus lietojumprogrammas paziņojumus. Ja ir nepieciešama atzvanīšanas funkcijas izvade, galvenajā () funkcijā izmantojiet (lasiet un parādiet) to tur un pēc tam.

Populārākās Oculus App Lab spēles
Ja esat Oculus austiņu īpašnieks, jums ir jāsazinās par sānu ielādi. Sānu ielāde ir process, kurā austiņās tiek instalēts saturs, kas nav veikals. Sid...
10 labākās spēles, kuras spēlēt Ubuntu
Windows platforma ir bijusi viena no dominējošajām spēļu platformām, jo ​​mūsdienās tiek attīstīts milzīgs spēļu skaits, lai atbalstītu Windows. Vai k...
5 labākās arkādes spēles Linux
Mūsdienās datori ir nopietnas mašīnas, kuras izmanto spēlēšanai. Ja jūs nevarat iegūt jauno augsto rezultātu, jūs zināt, ko es domāju. Šajā ierakstā j...