Takaisinsoittofunktio on funktio, joka on argumentti, ei parametri, toisessa funktiossa. Toista toimintoa voidaan kutsua pääfunktioksi. Joten kyseessä on kaksi toimintoa: päätoiminto ja itse takaisinsoittotoiminto. Pääfunktion parametriluettelossa takaisinsoittofunktion ilmoitus ilman sen määrittelyä on läsnä, samoin kuin olioilmoitukset ilman määritystä ovat läsnä. Pääfunktio kutsutaan argumenteilla (main ()). Yksi pääfunktiokutsun argumenteista on takaisinkutsufunktion tehokas määrittely. Kohdassa C ++ tämä argumentti viittaa takaisinsoittofunktion määrittelyyn; se ei ole varsinainen määritelmä. Itse takaisinsoittotoimintoa kutsutaan itse asiassa pääfunktion määritelmässä.
Peruspuhelutoiminto C ++: ssa ei takaa asynkronista käyttäytymistä ohjelmassa. Asynkroninen käyttäytyminen on takaisinkutsutoimintamallin todellinen etu. Asynkronisessa takaisinkutsufunktiokaaviossa päätoiminnon tulos tulisi saada ohjelmalle ennen kuin takaisinsoittotoiminnon tulos saadaan. Tämä on mahdollista tehdä C ++: lla; C ++: lla on kuitenkin kirjasto, jota kutsutaan tulevaisuudeksi, jotta taataan asynkronisen takaisinsoittofunktion toiminta.
Tässä artikkelissa selitetään takaisinsoittotoimintojen perusmenetelmä. Paljon siitä on puhdasta C: tä++. Soiton osalta selitetään myös tulevan kirjaston peruskäyttäytyminen. Perustiedot C ++: sta ja sen osoittimista ovat välttämättömiä tämän artikkelin ymmärtämiseksi.
Artikkelin sisältö
- Perussoittotoimintamalli
- Synkroninen käyttäytyminen soittopyynnön kanssa
- Asynkroninen käyttäytyminen ja takaisinsoittotoiminto
- Tulevan kirjaston peruskäyttö
- Johtopäätös
Perussoittotoimintamalli
Soittotoimintamalli tarvitsee pääfunktion ja itse soittotoiminnon. Takaisinkutsutoiminnon ilmoitus on osa pääfunktion parametriluetteloa. Takaisinsoittotoiminnon määritelmä ilmaistaan pääfunktion funktiokutsussa. Takaisintoimintoa kutsutaan itse asiassa pääfunktion määritelmässä. Seuraava ohjelma kuvaa tätä:
#sisältääkäyttämällä nimitilaa vakio;
int pääosastoFn (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';
paluu iden;
int main ()
int (* ptr) (int) = &cb;
char cha [] = "ja";
pääFn (cha, cb);
paluu 0;
Tuotos on:
takaisinsoittotoimintopäätehtävä: 1 ja 2
Päätoiminto on tunnistettu mainosnimelläFF (). Takaisinsoittotoiminto tunnistaa cb (). Takaisinsoittotoiminto on määritelty pääfunktion ulkopuolella, mutta tosiasiallisesti sitä kutsutaan pääfunktion sisällä.
Huomaa takaisinsoittotoiminnon ilmoitus parametrina pääfunktiodeklaration parametriluettelossa. Takaisinsoittotoiminnon ilmoitus on "int (* ptr) (int)". Huomaa takaisinsoittofunktion lauseke, kuten funktiokutsu, pääfunktion määritelmään; mikä tahansa argumentti takaisinsoittofunktion kutsulle välitetään siellä. Tämän funktiokutsun lause on:
int idr = (* ptr) (id2);Missä id2 on argumentti. ptr on osa parametria, osoitinta, joka linkitetään takaisinsoittofunktion viitteeseen main () -funktiossa.
Huomaa lauseke:
int (* ptr) (int) = &cb;Main () -funktiossa, joka linkittää takaisinsoittofunktion ilmoituksen (ilman määritelmää) saman takaisinsoittofunktion määritelmän nimeen.
Pääfunktiota kutsutaan main () -funktiossa seuraavasti:
pääFn (cha, cb);Jossa cha on merkkijono ja cb on soittopyynnön nimi ilman mitään sen argumenttia.
Takaisinsoittotoiminnon synkroninen toiminta
Harkitse seuraavaa ohjelmaa:
#sisältääkäyttämällä nimitilaa vakio;
void basicFn (void (* ptr) ())
cout<<"principal function"<<'\n';
(* ptr) ();
void cb ()
cout<<"callback function"<<'\n';
void fn ()
cout<<"seen"<<'\n';
int main ()
void (* ptr) () = &cb;
pääasiallinenFn (cb);
fn ();
paluu 0;
Tuotos on:
päätehtävätakaisinsoittotoiminto
nähnyt
Tässä on uusi toiminto. Kaikki uusi toiminto on näyttää "nähty" -lähtö. Main () -funktiossa kutsutaan pääfunktiota ja sitten uutta funktiota fn (). Lähtö osoittaa, että pääfunktion koodi suoritettiin, sitten takaisinsoittotoiminnon koodi ja lopuksi fn () -toiminnon koodi. Tämä on synkronista (yksisäikeistä) käyttäytymistä.
Jos se olisi asynkronista käyttäytymistä, kun kolme koodisegmenttiä kutsutaan järjestyksessä, ensimmäinen koodisegmentti voidaan suorittaa, sen jälkeen kolmannen koodisegmentin suorittaminen, ennen kuin toinen koodisegmentti suoritetaan.
No, funktiota fn () voidaan kutsua pääfunktion määritelmän sisällä pääfunktion () sijasta seuraavasti:
#sisältääkäyttämällä nimitilaa vakio;
void fn ()
cout<<"seen"<<'\n';
void basicFn (void (* ptr) ())
cout<<"principal function"<<'\n';
fn ();
(* ptr) ();
void cb ()
cout<<"callback function"<<'\n';
int main ()
void (* ptr) () = &cb;
pääomaFn (cb);
paluu 0;
Tuotos on:
päätehtävänähnyt
takaisinsoittotoiminto
Tämä on asynkronisen käyttäytymisen jäljitelmä. Se ei ole asynkronista käyttäytymistä. Se on edelleen synkronista käyttäytymistä.
Myös pääfunktion koodisegmentin ja takaisinsoittofunktion koodisegmentin suoritusjärjestys voidaan vaihtaa pääfunktion määritelmässä. Seuraava ohjelma kuvaa tätä:
#sisältääkäyttämällä nimitilaa vakio;
void basicFn (void (* ptr) ())
(* ptr) ();
cout<<"principal function"<<'\n';
void cb ()
cout<<"callback function"<<'\n';
void fn ()
cout<<"seen"<<'\n';
int main ()
void (* ptr) () = &cb;
pääomaFn (cb);
fn ();
paluu 0;
Tulos on nyt,
takaisinsoittotoimintopäätehtävä
nähnyt
Tämä on myös asynkronisen käyttäytymisen jäljitelmä. Se ei ole asynkronista käyttäytymistä. Se on edelleen synkronista käyttäytymistä. Todellinen asynkroninen käyttäytyminen voidaan saada, kuten seuraavassa osassa selitetään, tai tulevaisuuden kirjaston kanssa.
Asynkroninen käyttäytyminen ja takaisinsoittotoiminto
Asynkronisen takaisinsoittotoiminnon perusnäytekoodi on:
tyyppi tuotos;tyyppi cb (tyypin lähtö)
// lausunnot
type basicFn (tyyppi input, type cb (type output))
// lausunnot
Huomaa tulo- ja lähtödatan sijainnit näennäiskoodin eri paikoissa. Takaisinsoittotoiminnon tulo on sen lähtö. Pääfunktion parametrit ovat yleisen koodin syöttöparametri ja takaisinkutsutoiminnon parametri. Tämän mallin avulla kolmas toiminto voidaan suorittaa (kutsua) pää () -funktiossa ennen kuin takaisinsoittotoiminnon lähtö luetaan (edelleen pää- () -toiminnossa). Seuraava koodi kuvaa tätä:
#sisältääkäyttämällä nimitilaa vakio;
char * tuotos;
void cb (char out [])
lähtö = ulos;
void basicFn (char-syöttö [], void (* ptr) (char [50]))
(* ptr) (syöttö);
cout<<"principal function"<<'\n';
void fn ()
cout<<"seen"<<'\n';
int main ()
char input [] = "takaisinsoittotoiminto";
void (* ptr) (char []) = &cb;
basicFn (tulo, cb);
fn ();
cout<