Показивач функције члана Ц++

Pokazivac Funkcije Clana C



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

Пример 1:

Укључујемо датотеку заглавља „иостреам“ да бисмо олакшали коришћење дефинисаних функција. Затим имамо „простор имена стд“. Испод тога генеришемо класу под називом „МиНевЦласс“ и користимо „јавни“ конструктор.

У „публиц“ креирамо функцију члана под називом „миФунц“ и декларишемо „инт нум“ као параметар „миФунц()“. Испод овога користимо „цоут“ и позивамо маин() метод испод овога у којем креирамо показивач функције члана. Декларишемо показивач „МиФунцПтр“ на тип функције члана, наводећи класу „МиНевЦласс“ и тип параметра (инт).







Након тога, креирамо објекат класе под називом “Цласс_обј” и затим позивамо функцију члана уз помоћ показивача “*МиФунцПтр” тако што стављамо објекат класе са овим. Додељујемо „10“ као параметар да ово прикажемо када позовемо показивач функције члана.



Код 1:

#инцлуде <иостреам>

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

цласс МиНевЦласс {

јавности :

празнина миФунц ( инт на једном ) {

цоут << 'Вредност је' << на једном << ендл ;

}

} ;

инт главни ( ) {

празнина ( МиНевЦласс ::* МиФунцПтр ) ( инт ) = & МиНевЦласс :: миФунц ;

МиНевЦласс Цласс_обј ;

( Цласс_обј. * МиФунцПтр ) ( 10 ) ;

повратак 0 ;

}

Излаз:



Ово илуструје рад показивача функције члана. Показивач функције члана може да се користи за динамичко покретање функција члана у складу са тренутним условима.





Пример 2:

Да бисмо једноставно користили функције које су дефинисане у датотеци заглавља „иостреам“, овде укључујемо „иостреам“. „Стд простора имена“ се поставља следеће. Испод њега креирамо класу „Тест“, а затим користимо „јавни“ конструктор. Дефинишемо функцију члана „миТестингФунц“ у „публиц“ и постављамо „инт т_валуе“ као параметар за „миТестингФунц()“ у овој инстанци. Функција „цоут“ се користи испод и позива се метода маин(). Затим креирамо показивач функције члана.



Овде наводимо класу „Тест“ и показивач функције члана „*МиТестФунцПтр“. Додељујемо „&Тест::миТестингФунц“ показивачу функције члана који је декларисан као „воид (Тест::*МиТестФунцПтр)(инт)“.

Затим генеришемо објекат класе „т_обј“ и користимо га за позивање функције члана тако што ћемо ставити објекат класе и користити показивач „*МиТестФунцПтр“. Да би ово било представљено када позовемо показивач функције члана, додељујемо „932“ као параметар.

Код 2:

#инцлуде <иостреам>

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

разред Тест {

јавности :

празнина миТестингФунц ( инт т_валуе ) {

цоут << 'Вредност тестирања је' << т_валуе << ендл ;

}

} ;

инт главни ( ) {

празнина ( Тест ::* МиТестФунцПтр ) ( инт ) = & Тест :: миТестингФунц ;

Тест т_обј ;

( т_обј. * МиТестФунцПтр ) ( 932 ) ;

повратак 0 ;

}

Излаз:

Исход датог кода је приказан. Можемо видети да смо назвали „показивач функције члана“ са објектом класе као што је приказано овде.

Пример 3:

Класа коју генеришемо у овом коду је „МиНевЦар“ где користимо „јавни“ конструктор и креирамо функцију члана у њему која је „стартЦарЕнгине()“. У ову функцију додајемо „цоут“ који се приказује када ову функцију позовемо у нашем коду. Затим креирамо другу функцију члана која је „стопЦарЕнгине()“ и поново користимо „цоут“ у овој функцији члана.

Након овога, позивамо функцију маин(), а затим декларишемо показивач функције члана који је „МиНевЦар::*царЕнгинеФунц()“. Испод овога креирамо објекат класе „МиНевЦар“ са именом „миЦар_обј“. Затим додељујемо функцију „стартЦарЕнгине“ показивачу „царЕнгинеФунц“. Испод овога називамо ову функцију уз помоћ показивача „царЕнгинеФунц“ тако што стављамо име објекта уз њу.

Затим, функцију „стопЦарЕнгине“ поново додељујемо показивачу „царЕнгинеФунц“. Испод тога позивамо ову функцију тако што ћемо проследити име објекта заједно са референцом „царЕнгинеФунц“.

Код 3:

#инцлуде <иостреам>

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

класа МиНевЦар {

јавности :

празнина стартЦарЕнгине ( ) {

цоут << 'Мотор аутомобила се покреће' << ендл ;

}

празнина стопЦарЕнгине ( ) {

цоут << 'Мотор аутомобила се зауставља' << ендл ;

}

} ;

инт главни ( ) {

празнина ( Мој нови ауто ::* царЕнгинеФунц ) ( ) ;

МиНевЦар миЦар_обј ;

царЕнгинеФунц = & Мој нови ауто :: стартЦарЕнгине ;

( миЦар_обј. * царЕнгинеФунц ) ( ) ;

царЕнгинеФунц = & Мој нови ауто :: стопЦарЕнгине ;

( миЦар_обј. * царЕнгинеФунц ) ( ) ;

повратак 0 ;

}

Излаз:

Овде је приказан рад „показивача функције члана“. Видимо да смо креирали показивач функције члана и приказали резултат овде.

Пример 4:

Након што смо укључили датотеку заглавља и „стд намеспаце“, овде декларишемо класу „МиНевСтудент“. Функција члана ” студентПасс()” је једна од функција члана које градимо за класу “МиСтудентЦласс” коју генеришемо овде. Такође додајемо „цоут“ овој функцији која ће се приказати када је позовемо у нашем коду.

Затим пишемо функцију члана „студентФаил()“ где још једном користимо „цоут“. Затим се позива функција маин() и декларише се показивач функције члана „(МиНевСтудент::*студентРесултФунц)()“. Испод тога генеришемо објекат ” миСтд_обј ” који припада класи “МиНевСтудент”.

Затим, додељујемо функцију „студентПасс“ показивачу „студентРесултФунц“. Испод тога позивамо ову функцију тако што проследимо име објекта заједно са референцом „студентРесултФунц“. Функција „студентФаил“ се поново додељује показивачу „ студентРесултФунц “. Испод тога, позивамо ову методу дајући референцу „царЕнгинеФунц“ и име објекта.

Сада се обе функције позивају овде и искази које смо укључили у ове функције се приказују.

Код 4:

#инцлуде <иостреам>

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

разред МиНевСтудент {

јавности :

празнина студентПасс ( ) {

цоут << 'Студентска пропусница' << ендл ;

}

празнина студентФаил ( ) {

цоут << 'Ученик није успео' << ендл ;

}

} ;

инт главни ( ) {

празнина ( МиНевСтудент ::* студентРесултФунц ) ( ) ;

МиНевСтудент миСтд_обј ;

студентРесултФунц = & МиНевСтудент :: студентПасс ;

( миСтд_обј. * студентРесултФунц ) ( ) ;

студентРесултФунц = & МиНевСтудент :: студентФаил ;

( миСтд_обј. * студентРесултФунц ) ( ) ;

повратак 0 ;

}

Излаз:

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

Пример 5:

У овом случају се креира „СамплеЦласс“. Затим се овде поставља показивач функције члана који је „(СамплеЦласс::*МиФунц)()“. Испод овога креирамо показивач функције који је „(*МиФунцПтр)()“. Испод њега декларишемо „име“ променљиве „стринг“ као и показивач функције члана „МиФунц ф“.

Након овога, имамо „јавни“ конструктор где дефинишемо ову променљиву функције члана. Испод тога креирамо функције члана под називом „миФунц_1()“ и „миФунц_1()“ и такође додајемо „цоут“ у сваку функцију члана која ће се приказати када позовемо ову функцију члана.

Затим, позивамо овај показивач функције члана уз помоћ „(ово->*ф)()“. Затим поново постављамо функције. Овде мењамо „цоут“ изјаве које смо претходно додали. Затим, „маин()“ се сада позива и показивач функције члана је дефинисан као „МиФунц ф = &СамплеЦласс::миФунц_2“.

Затим, показивач функције је такође дефинисан као „МиФунцПтр фп = миФунц_1“. Након тога, укуцамо „(а.*ф)()“ да бисмо користили показивач функције члана. „б.фунц“ се поставља да користи функцију члана. Затим постављамо „фп()“ да позовемо показивач функције.

Код 5:

#инцлуде <иостреам>

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

цласс СамплеЦласс ;

типедеф празнина ( СамплеЦласс ::* МиФунц ) ( ) ;

типедеф празнина ( * МиФунцПтр ) ( ) ;

цласс СамплеЦласс {

назив стринга ;

МиФунц ф ;

јавности :

СамплеЦласс ( конст цхар * име )

: име ( име ) ,

ф ( & СамплеЦласс :: миФунц_1 )

{ }

празнина миФунц_1 ( ) { цоут << име << 'Овде смо звали фукцију 1' << ендл ; }

празнина миФунц_2 ( ) { цоут << име << 'Овде смо позвали функцију 2' << ендл ; }

празнина фунц ( ) {

( ово ->* ф ) ( ) ;

}

} ;

празнина миФунц_1 ( ) { цоут << 'Прва функција' << ендл ; }

празнина миФунц_2 ( ) { цоут << 'Друга функција' << ендл ; }

инт главни ( )

{

МиФунц ф = & СамплеЦласс :: миФунц_2 ;

МиФунцПтр фп = миФунц_1 ;

СамплеЦласс а ( 'први - ' ) , б ( 'друго -' ) ;

( а. * ф ) ( ) ;

б. фунц ( ) ;

фп ( ) ;

}

Излаз:

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

Закључак

Истражили смо да „показивачи функција чланова“ у Ц++ олакшавају динамичко везивање, инкапсулацију понашања и флексибилно руковање позивањем функције у контексту ООП-а. Сазнали смо да употреба „показивача функција чланова“ може значајно побољшати модуларност и флексибилност Ц++ кодних база, пружајући моћан алат за решавање бројних изазова дизајна и времена извршавања.