Ц ++

Функција повратног позива у Ц ++

Функција повратног позива у Ц ++

Функција повратног позива је функција која је аргумент, а не параметар друге функције. Друга функција се може назвати главном функцијом. Дакле, укључене су две функције: главна функција и сама функција повратног позива. У листи параметара главне функције присутна је декларација функције повратног позива без њене дефиниције, баш као што су присутне декларације објеката без доделе. Главна функција се позива са аргументима (у маин ()). Један од аргумената у позиву главне функције је ефикасна дефиниција функције повратног позива. У Ц ++, овај аргумент је референца на дефиницију функције повратног позива; то није стварна дефиниција. Сама функција повратног позива заправо се позива у оквиру дефиниције главне функције.

Основна функција повратног позива у Ц ++-у не гарантује асинхроно понашање у програму.  Асинхроно понашање је стварна корист шеме функције повратног позива. У асинхроној шеми функције повратног позива, резултат главне функције треба добити за програм пре него што се добије резултат функције повратног позива. То је могуће учинити на Ц ++; међутим, Ц ++ има библиотеку која се зове будућност како би се загарантовало понашање шеме асинхроног повратног позива.

Овај чланак објашњава основну шему функције повратног позива. Доста је са чистим Ц++. Што се тиче повратног позива, такође је објашњено основно понашање будуће библиотеке. За разумевање овог чланка неопходно је основно знање о језику Ц ++ и његових смерница.

Садржај чланка

Основна шема функције повратног позива

Шема функције повратног позива треба главну функцију и саму функцију повратног позива. Декларација функције повратног позива је део листе параметара главне функције. Дефиниција функције повратног позива је назначена у позиву функције главне функције. Функција повратног позива се заправо позива у оквиру дефиниције главне функције. Следећи програм то илуструје:

#инцлуде
коришћење простора имена стд;
инт принципалФн (цхар цх [], инт (* птр) (инт))

инт ид1 = 1;
инт ид2 = 2;
инт идр = (* птр) (ид2);
цоут<<"principal function: "<ретурн ид1;

инт цб (инт иден)

цоут<<"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;
принципалФн (инпут, цб);
фн ();
цоут<ретурн 0;

Излаз програма је:

главна функција
виђено
функција повратног позива

У овом конкретном коду, излазни и улазни датум су исти датум. Резултат трећег позива функције у функцији маин () приказан је пре резултата функције повратног позива. Функција повратног позива је извршена, завршена и свој резултат (вредност) додељује променљивој, излаз, омогућавајући програму да настави без њених сметњи. У главној () функцији, излаз функције повратног позива се користио (читао и приказивао) када је то требало, што је довело до асинхроног понашања за целу шему.

Ово је једнонитни начин за постизање асинхроног понашања функције повратног позива са чистим Ц++.

Основна употреба будуће Библиотеке

Идеја асинхроне шеме функције повратног позива је да се главна функција врати пре него што се функција повратног позива врати. То је учињено индиректно, ефикасно, у горе наведеном коду.

Приметите из горњег кода да функција повратног позива прима главни улаз за код и даје главни излаз за код. Библиотека Ц ++, будући, има функцију која се зове синц (). Први аргумент ове функције је референца функције повратног позива; други аргумент је улаз у функцију повратног позива. Функција синц () се враћа без чекања да се изврши функција повратног позива, али омогућава довршавање функције повратног позива. Ово обезбеђује асинхроно понашање. Док се функција повратног позива наставља извршавати, будући да се функција синц () већ вратила, изрази испод ње настављају се извршавати. Ово је попут идеалног асинхроног понашања.

Горњи програм је преписан у наставку, узимајући у обзир будућу библиотеку и њену функцију синхронизације ():

#инцлуде
#инцлуде
#инцлуде
коришћење простора имена стд;
будућност оутпут;
стринг цб (стринг стри)

ретурн стри;

воид принципалФн (стринг инпут)

излаз = асинхронизација (цб, улаз);
цоут<<"principal function"<<'\n';

воид фн ()

цоут<<"seen"<<'\n';

инт маин ()

стринг инпут = стринг („функција повратног позива“);
принципалФн (улаз);
фн ();
стринг рет = оутпут.добити(); // чека повратак позива ако је потребно
цоут<ретурн 0;

Функција синц () коначно складишти излаз функције повратног позива у будући објекат. Очекивани излаз се може добити у функцији маин (), користећи функцију члана гет () будућег објекта.

Закључак

Функција повратног позива је функција која је аргумент, а не параметар друге функције. Шема функције повратног позива треба главну функцију и саму функцију повратног позива. Декларација функције повратног позива је део листе параметара главне функције. Дефиниција функције повратног позива је назначена у позиву функције главне функције (у маин ()). Функција повратног позива се заправо позива у оквиру дефиниције главне функције.

Шема функције повратног позива није нужно асинхрона. Да бисте били сигурни да је шема функције повратног позива асинхрона, унесите главни улаз у код, улаз у функцију повратног позива; направити главни излаз кода, излаз функције повратног позива; похранити излаз функције повратног позива у променљиву или структуру података. У функцији маин (), након позива главне функције, извршите остале изразе апликације. Када је потребан излаз функције повратног позива, у главној () функцији је користите (прочитајте и прикажите) тамо и тада.

Најбоље игре за ручно праћење
Оцулус Куест је недавно представио сјајну идеју ручног праћења без контролера. Са све већим бројем игара и активности које извршавају подршку формално...
Како приказати ОСД прекривач у целом екрану Линук апликација и игара
Играње игара преко целог екрана или коришћење апликација у режиму целог екрана без ометања може вам одсећи релевантне системске информације видљиве на...
Топ 5 карата за хватање игара
Сви смо видели и волели стримовање играња на ИоуТубе-у. ПевДиеПие, Јакесептицие и Маркиплиер само су неки од најбољих играча који су зарадили милионе ...