Tagasihelistamisfunktsioon on funktsioon, mis on teise funktsiooni argument, mitte parameeter. Teist funktsiooni võib nimetada põhifunktsiooniks. Seega on kaasatud kaks funktsiooni: põhifunktsioon ja tagasihelistamisfunktsioon ise. Põhifunktsiooni parameetrite loendis on olemas tagasihelistamisfunktsiooni deklaratsioon ilma selle määratluseta, nagu ka objektideklaratsioonid ilma omistamiseta. Põhifunktsiooni kutsutakse argumentidega (in main ()). Üks põhifunktsiooni väljakutse argument on tagasihelistamisfunktsiooni tõhus määratlus. C ++ keeles on see argument viide tagasihelistamisfunktsiooni määratlusele; see pole tegelik määratlus. Tagasihelistamisfunktsiooni ennast kutsutakse tegelikult põhifunktsiooni määratluses.
Põhihelistaja funktsioon C ++ ei taga programmi asünkroonset käitumist. Asünkroonne käitumine on tagasihelistamisfunktsioonide skeemi tegelik eelis. Asünkroonse tagasihelistamisfunktsiooni skeemis peaks programmi jaoks saama põhifunktsiooni tulemus enne tagasihelistamisfunktsiooni tulemuse saamist. Seda on võimalik teha C ++ keeles; asünkroonse tagasihelistamisfunktsiooni skeemi käitumise tagamiseks on C ++-l aga kogu, mida nimetatakse tulevikuks.
Selles artiklis selgitatakse tagasihelistamisfunktsioonide põhiskeemi. Suur osa sellest on puhta C-ga++. Mis puudutab tagasihelistamist, siis selgitatakse ka tulevase raamatukogu põhikäitumist. Selle artikli mõistmiseks on vaja põhiteadmisi C ++ ja selle viidete kohta.
Artikli sisu
- Põhihelistamisfunktsioonide skeem
- Sünkroonne käitumine tagasihelistamisfunktsiooniga
- Asünkroonne käitumine koos tagasihelistamisfunktsiooniga
- Tulevase raamatukogu põhikasutus
- Järeldus
Põhihelistamisfunktsioonide skeem
Tagasihelistamisfunktsioonide skeem vajab põhifunktsiooni ja tagasihelistamisfunktsioon ise. Tagasihelistamisfunktsiooni deklaratsioon on osa põhifunktsiooni parameetrite loendist. Tagasihelistamisfunktsiooni määratlus on näidatud põhifunktsiooni funktsioonikutses. Tagasihelistamisfunktsiooni nimetatakse tegelikult põhifunktsiooni määratluses. Järgmine programm illustreerib seda:
# kaasatanimeruumi kasutamine std;
int peamineFn (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';
tagasiside iden;
int main ()
int (* ptr) (int) = &cb;
char cha [] = "ja";
peamineFn (cha, cb);
tagastama 0;
Väljund on:
tagasihelistamisfunktsioonpõhifunktsioon: 1 ja 2
Põhifunktsioon tuvastatakse peafn () abil. Tagasihelistamisfunktsiooni tuvastab cb (). Tagasihelistamisfunktsioon on määratletud väljaspool põhifunktsiooni, kuid tegelikult kutsutakse seda põhifunktsiooni piires.
Pange tähele tagasihelistamisfunktsiooni deklaratsioon parameetrina põhifunktsiooni deklaratsiooni parameetrite loendis. Tagasihelistamisfunktsiooni deklaratsioon on “int (* ptr) (int)”. Pange funktsiooni tagasihelistamise avaldis nagu funktsiooni väljakutse põhifunktsiooni määratlusse; sinna edastatakse mis tahes argument tagasihelistamisfunktsiooni väljakutse jaoks. Selle funktsioonikõne lause on:
int idr = (* ptr) (id2);Kus id2 on argument. ptr on parameetri osa, osuti, mis on seotud peafunktsiooni () tagasihelistamisfunktsiooni viitega.
Pange tähele väljendit:
int (* ptr) (int) = &cb;Funktsioonis main (), mis seob tagasihelistamisfunktsiooni deklaratsiooni (ilma määratluseta) sama tagasihelistamisfunktsiooni definitsiooni nimega.
Põhifunktsiooni nimetatakse main () funktsioonis järgmiselt:
peamineFn (cha, cb);Kui cha on string ja cb on tagasihelistamisfunktsiooni nimi ilma selle argumendita.
Tagasihelistamisfunktsiooni sünkroonne käitumine
Mõelge järgmisele programmile:
# kaasatanimeruumi kasutamine std;
void basicFn (void (* ptr) ())
cout<<"principal function"<<'\n';
(* ptr) ();
kehtetu cb ()
cout<<"callback function"<<'\n';
tühine fn ()
cout<<"seen"<<'\n';
int main ()
tühine (* ptr) () = &cb;
peamineFn (cb);
fn ();
tagastama 0;
Väljund on:
põhifunktsioontagasihelistamisfunktsioon
nähtud
Siin on uus funktsioon. Uue funktsioonina kuvatakse väljund, "nähtud". Funktsioonis main () nimetatakse põhifunktsiooni, seejärel uut funktsiooni fn (). Väljund näitab, et põhifunktsiooni kood käivitati, seejärel tagasihelistamisfunktsiooni kood ja lõpuks fn () funktsiooni. See on sünkroonne (ühe keermega) käitumine.
Kui tegemist oleks asünkroonse käitumisega, võidakse kolme koodisegmendi järjestusse kutsumisel enne teise koodisegmendi käivitamist käivitada esimene koodisegment, millele järgneb kolmanda koodisegmendi käivitamine.
Noh, funktsiooni fn () saab kutsuda põhifunktsiooni määratluses, mitte funktsiooni main () järgi:
# kaasatanimeruumi kasutamine std;
tühine fn ()
cout<<"seen"<<'\n';
void basicFn (void (* ptr) ())
cout<<"principal function"<<'\n';
fn ();
(* ptr) ();
kehtetu cb ()
cout<<"callback function"<<'\n';
int main ()
tühine (* ptr) () = &cb;
peamineFn (cb);
tagastama 0;
Väljund on:
põhifunktsioonnähtud
tagasihelistamisfunktsioon
See on asünkroonse käitumise jäljendamine. See pole asünkroonne käitumine. See on ikkagi sünkroonne käitumine.
Samuti saab põhifunktsiooni määratluses vahetada põhifunktsiooni koodisegmendi ja tagasihelistamisfunktsiooni koodisegmendi täitmise järjekorra. Järgmine programm illustreerib seda:
# kaasatanimeruumi kasutamine std;
void basicFn (void (* ptr) ())
(* ptr) ();
cout<<"principal function"<<'\n';
kehtetu cb ()
cout<<"callback function"<<'\n';
tühine fn ()
cout<<"seen"<<'\n';
int main ()
tühine (* ptr) () = &cb;
peamineFn (cb);
fn ();
tagastama 0;
Väljund on nüüd,
tagasihelistamisfunktsioonpõhifunktsioon
nähtud
See on ka asünkroonse käitumise jäljendamine. See pole asünkroonne käitumine. See on ikkagi sünkroonne käitumine. Tõelise asünkroonse käitumise võib saada järgmises jaotises selgitatuna või tuleviku teegiga.
Asünkroonne käitumine koos tagasihelistamisfunktsiooniga
Asünkroonse tagasihelistamise põhiskeemi pseudokood on:
tüüp väljund;tüüp cb (tüüp väljund)
// avaldused
type basicFn (tüübi sisend, tüüp cb (tüübi väljund))
// avaldused
Pange tähele sisend- ja väljundandmete asukohad pseudokoodi erinevates kohtades. Tagasihelistamisfunktsiooni sisend on selle väljund. Põhifunktsiooni parameetrid on üldkoodi sisendparameetrid ja tagasihelistamisfunktsiooni parameetrid. Selle skeemi abil saab funktsiooni main () funktsioonis käivitada (kutsuda) kolmanda funktsiooni enne tagasihelistamisfunktsiooni väljundi lugemist (endiselt põhifunktsioonis ()). Järgmine kood illustreerib seda:
# kaasatanimeruumi kasutamine std;
char * väljund;
void cb (char out [])
väljund = välja;
void basicFn (char sisend [], void (* ptr) (char [50]))
(* ptr) (sisend);
cout<<"principal function"<<'\n';
tühine fn ()
cout<<"seen"<<'\n';
int main ()
char input [] = "tagasihelistamisfunktsioon";
tühine (* ptr) (char []) = &cb;
peamineFn (sisend, cb);
fn ();
cout<