Функција повратног позива је функција која је аргумент, а не параметар друге функције. Друга функција се може назвати главном функцијом. Дакле, укључене су две функције: главна функција и сама функција повратног позива. У листи параметара главне функције присутна је декларација функције повратног позива без њене дефиниције, баш као што су присутне декларације објеката без доделе. Главна функција се позива са аргументима (у маин ()). Један од аргумената у позиву главне функције је ефикасна дефиниција функције повратног позива. У Ц ++, овај аргумент је референца на дефиницију функције повратног позива; то није стварна дефиниција. Сама функција повратног позива заправо се позива у оквиру дефиниције главне функције.
Основна функција повратног позива у Ц ++-у не гарантује асинхроно понашање у програму. Асинхроно понашање је стварна корист шеме функције повратног позива. У асинхроној шеми функције повратног позива, резултат главне функције треба добити за програм пре него што се добије резултат функције повратног позива. То је могуће учинити на Ц ++; међутим, Ц ++ има библиотеку која се зове будућност како би се загарантовало понашање шеме асинхроног повратног позива.
Овај чланак објашњава основну шему функције повратног позива. Доста је са чистим Ц++. Што се тиче повратног позива, такође је објашњено основно понашање будуће библиотеке. За разумевање овог чланка неопходно је основно знање о језику Ц ++ и његових смерница.
Садржај чланка
- Основна шема функције повратног позива
- Синхроно понашање са функцијом повратног позива
- Асинхроно понашање са функцијом повратног позива
- Основна употреба будуће Библиотеке
- Закључак
Основна шема функције повратног позива
Шема функције повратног позива треба главну функцију и саму функцију повратног позива. Декларација функције повратног позива је део листе параметара главне функције. Дефиниција функције повратног позива је назначена у позиву функције главне функције. Функција повратног позива се заправо позива у оквиру дефиниције главне функције. Следећи програм то илуструје:
#инцлудекоришћење простора имена стд;
инт принципалФн (цхар цх [], инт (* птр) (инт))
инт ид1 = 1;
инт ид2 = 2;
инт идр = (* птр) (ид2);
цоут<<"principal function: "<
инт цб (инт иден)
цоут<<"callback function"<<'\n';
ретурн иден;
инт маин ()
инт (* птр) (инт) = &cb;
цхар цха [] = "и";
принципалФн (цха, цб);
ретурн 0;
Излаз је:
функција повратног позиваглавна функција: 1 и 2
Главна функција је идентификована помоћу принципалФн (). Функција повратног позива идентификована је цб (). Функција повратног позива дефинирана је изван главне функције, али заправо се позива унутар главне функције.
Обратите пажњу на декларацију функције повратног позива као параметар на листи параметара главне декларације функције. Декларација функције повратног позива је „инт (* птр) (инт)“. Обратите пажњу на израз функције повратног позива, попут позива функције, у дефиницији главне функције; ту се прослеђује било који аргумент за позив функције повратног позива. Изјава за овај позив функције је:
инт идр = (* птр) (ид2);Где је ид2 аргумент. птр је део параметра, показивач, који ће бити повезан са референцом функције повратног позива у функцији маин ().
Обратите пажњу на израз:
инт (* птр) (инт) = &cb;У функцији маин (), која повезује декларацију (без дефиниције) функције повратног позива са именом дефиниције исте функције повратног позива.
Главна функција се у функцији маин () назива:
принципалФн (цха, цб);Где је цха низ, а цб је име функције повратног позива без иједног аргумента.
Синхроно понашање функције повратног позива
Размотрите следећи програм:
#инцлудекоришћење простора имена стд;
воид принципалФн (воид (* птр) ())
цоут<<"principal function"<<'\n';
(* птр) ();
воид цб ()
цоут<<"callback function"<<'\n';
воид фн ()
цоут<<"seen"<<'\n';
инт маин ()
воид (* птр) () = &cb;
принципалФн (цб);
фн ();
ретурн 0;
Излаз је:
главна функцијафункција повратног позива
виђено
Овде је нова функција. Све што нова функција ради је да прикаже излаз, „виђен“. У функцији маин () позива се главна функција, а затим се позива нова функција, фн (). Излаз показује да је извршен код за главну функцију, затим за функцију повратног позива и коначно да је извршена за функцију фн (). Ово је синхроно (једнонитно) понашање.
Ако се ради о асинхроном понашању, када се позову три сегмента кода редом, може се извршити први сегмент кода, а затим извршење трећег сегмента кода, пре него што се изврши други сегмент кода.
Па, функција фн () се може позвати из дефиниције главне функције, уместо из функције маин (), како следи:
#инцлудекоришћење простора имена стд;
воид фн ()
цоут<<"seen"<<'\n';
воид принципалФн (воид (* птр) ())
цоут<<"principal function"<<'\n';
фн ();
(* птр) ();
воид цб ()
цоут<<"callback function"<<'\n';
инт маин ()
воид (* птр) () = &cb;
принципалФн (цб);
ретурн 0;
Излаз је:
главна функцијавиђено
функција повратног позива
Ово је имитација асинхроног понашања. То није асинхроно понашање. То је још увек синхроно понашање.
Такође, редослед извршавања сегмента кода главне функције и сегмента кода функције повратног позива могу се заменити у дефиницији главне функције. Следећи програм то илуструје:
#инцлудекоришћење простора имена стд;
воид принципалФн (воид (* птр) ())
(* птр) ();
цоут<<"principal function"<<'\n';
воид цб ()
цоут<<"callback function"<<'\n';
воид фн ()
цоут<<"seen"<<'\n';
инт маин ()
воид (* птр) () = &cb;
принципалФн (цб);
фн ();
ретурн 0;
Излаз је сада,
функција повратног позиваглавна функција
виђено
Ово је такође имитација асинхроног понашања. То није асинхроно понашање. То је још увек синхроно понашање. Право асинхроно понашање може се добити како је објашњено у следећем одељку или у библиотеци, у будућности.
Асинхроно понашање са функцијом повратног позива
Псеудо-код за основну асинхрону шему функције повратног позива је:
типе оутпут;тип цб (излаз типа)
// изјаве
тип принципалФн (тип улаза, тип цб (излаз типа))
// изјаве
Забележите положај улазних и излазних података на различитим местима псеудо-кода. Улаз функције повратног позива је његов излаз. Параметри главне функције су улазни параметар за општи код и параметар за функцију повратног позива. Помоћу ове шеме може се извршити (позвати) трећа функција у функцији маин () пре него што се прочита излаз функције повратног позива (још увек у функцији маин ()). Следећи код то илуструје:
#инцлудекоришћење простора имена стд;
цхар * излаз;
поништи цб (уцртај [])
оутпут = оут;
воид принципалФн (цхар инпут [], воид (* птр) (цхар [50]))
(* птр) (улаз);
цоут<<"principal function"<<'\n';
воид фн ()
цоут<<"seen"<<'\n';
инт маин ()
цхар инпут [] = "функција повратног позива";
воид (* птр) (цхар []) = &cb;
принципалФн (инпут, цб);
фн ();
цоут<