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

Callback Function C



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

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







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



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

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

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



#инцлуде

Користећи именски просторсати;



интмаинФн(цхарцх[],инт (*птр)(инт))

{

интид1= 1;

интид2= 2;

интобично= (*птр)(ид2);

цена<<'главна функција:'<<ид1<<''<<цх<<''<<обично<<' н';

повратакид1;

}


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

{

цена<<'функција повратног позива'<<' н';

повратакиден;

}


интглавни()

{

инт (*птр)(инт) = &цб;

цхарне[] = 'и';

маинФн(отац, цб);



повратак 0;

}

Излаз је:





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

главна функција: 1 и 2

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

Обратите пажњу на декларацију функције повратног позива као параметра у листи параметара декларације главне функције. Декларација функције повратног позива је инт (*птр) (инт). Обратите пажњу на израз функције повратног позива, попут позива функције, у дефиницији главне функције; сваки аргумент за позив функције повратног позива се прослеђује тамо. Наредба за овај позив функције је:



интобично= (*птр)(ид2);

Где је ид2 аргумент. птр је део параметра, показивач, који ће бити повезан са референцом функције повратног позива у функцији маин ().

Обратите пажњу на израз:

инт (*птр)(инт) = &цб;

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

Главна функција се у функцији маин () позива као:

маинФн(отац, цб);

Где је цха низ, а цб назив функције повратног позива без икаквог њеног аргумента.

Синхроно понашање функције повратног позива

Размотрите следећи програм:

#инцлуде

Користећи именски просторсати;



празнинамаинФн(празнина (*птр)())

{

цена<<'главна функција'<<' н';

(*птр)();

}


празнинацб()

{

цена<<'функција повратног позива'<<' н';

}


празнинафн()

{

цена<<'виђено'<<' н';

}


интглавни()

{

празнина (*птр)() = &цб;

маинФн(цб);

фн();



повратак 0;

}

Излаз је:

главна функција

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

виђено

Овде постоји нова функција. Све што нова функција ради је да прикаже излаз, видљив. У функцији маин () позива се главна функција, затим нова функција, фн (). Излаз показује да је извршен код за главну функцију, затим за функцију повратног позива и на крају за функцију фн (). Ово је синхроно (једнонавојно) понашање.

Да се ​​ради о асинхроном понашању, када се позову три сегмента кода, може се извршити први сегмент кода, након чега следи извршење трећег сегмента кода, пре него што се изврши други сегмент кода.

Па, функција, фн () се може позвати унутар дефиниције главне функције, уместо унутар функције маин (), на следећи начин:

#инцлуде

Користећи именски просторсати;



празнинафн()

{

цена<<'виђено'<<' н';

}


празнинамаинФн(празнина (*птр)())

{

цена<<'главна функција'<<' н';

фн();

(*птр)();

}


празнинацб()

{

цена<<'функција повратног позива'<<' н';

}


интглавни()

{

празнина (*птр)() = &цб;

маинФн(цб);



повратак 0;

}

Излаз је:

главна функција

виђено

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

Ово је имитација асинхроног понашања. То није асинхроно понашање. То је и даље синхроно понашање.

Такође, редослед извршења кодног сегмента главне функције и кодног сегмента функције повратног позива могу се заменити у дефиницији главне функције. Следећи програм то илуструје:

#инцлуде

Користећи именски просторсати;



празнинамаинФн(празнина (*птр)())

{

(*птр)();

цена<<'главна функција'<<' н';

}


празнинацб()

{

цена<<'функција повратног позива'<<' н';

}


празнинафн()

{

цена<<'виђено'<<' н';

}


интглавни()

{

празнина (*птр)() = &цб;

маинФн(цб);

фн();



повратак 0;

}

Излаз је сада,

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

главна функција

виђено

Ово је такође имитација асинхроног понашања. То није асинхроно понашање. То је и даље синхроно понашање. Истинско асинхроно понашање може се добити као што је објашњено у следећем одељку или са библиотеком, будућност.

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

Псеудокод за основну шему функција асинхроног повратног позива је:

тип излаз;

тип цб(тип излаз)

{

// изјаве

}


тип принципалФн(унос типа, тип цб(тип излаз))

{

// изјаве

}

Забележите положаје улазних и излазних података на различитим местима псеудо кода. Улаз функције повратног позива је њен излаз. Параметри главне функције су улазни параметар за општи код и параметар за функцију повратног позива. Са овом шемом, трећа функција се може извршити (позвати) у функцији маин () пре него што се прочита излаз функције повратног позива (још увек у функцији маин ()). Следећи код то илуструје:

#инцлуде

Користећи именски просторсати;

цхар *излаз;


празнинацб(цхароут[])

{

излаз=оут;

}



празнинамаинФн(цхарулазни[],празнина (*птр)(цхар[педесет]))

{

(*птр)(улазни);

цена<<'главна функција'<<' н';

}


празнинафн()

{

цена<<'виђено'<<' н';

}


интглавни()

{

цхарулазни[] = 'функција повратног позива';

празнина (*птр)(цхар[]) = &цб;

маинФн(улаз, цб);

фн();

цена<<излаз<<' н';



повратак 0;

}

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

главна функција

виђено

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

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

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

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

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

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

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

#инцлуде

#инцлуде

#инцлуде

Користећи именски просторсати;

будућност<низ>излаз;

стринг цб(стринг стри)

{

повратакстри;

}



празнинамаинФн(стринг инпут)

{

излаз=асинц(цб, улаз);

цена<<'главна функција'<<' н';

}


празнинафн()

{

цена<<'виђено'<<' н';

}


интглавни()

{

стринг инпут=низ('функција повратног позива');

маинФн(улазни);

фн();

стринг рет=излаз.добити(); // чека да се повратни позив врати ако је потребно

цена<<јел тако<<' н';



повратак 0;

}

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

Закључак

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

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