Указатель функции-члена C++

Ukazatel Funkcii Clena C



В C++ указатели на функции-члены помогают ссылаться на функции-члены внутри класса. Они предоставляют возможность сохранять и вызывать функцию-член экземпляра класса, обеспечивая гибкость и расширяемость в различных ситуациях. Одним из распространенных случаев использования указателей на функции-члены является ситуация, когда в зависимости от условий выполнения необходимо запускать различные варианты поведения. Приложение может динамически выбирать и вызывать подходящее поведение, используя указатели на функции-члены. Кроме того, указатели на функции-члены полезны в ситуациях, когда требуется разделение компонентов системы.

Пример 1:

Мы включаем заголовочный файл «iostream», чтобы упростить использование определенных функций. Затем у нас есть «пространство имен std». Под этим мы генерируем класс с именем «MyNewClass» и используем «публичный» конструктор.

В «public» мы создаем функцию-член с именем «myFunc» и объявляем «int num» в качестве параметра «myFunc()». Ниже мы используем «cout» и вызываем метод main() ниже этого, в котором мы создаем указатель на функцию-член. Мы объявляем указатель «MyFuncPtr» на тип функции-члена, указывая класс «MyNewClass» и тип параметра (int).







После этого мы создаем объект класса с именем «Class_obj», а затем вызываем функцию-член с помощью указателя «*MyFuncPtr», помещая в него объект класса. Мы назначаем «10» в качестве параметра для его визуализации, когда мы вызываем указатель на функцию-член.



Код 1:

#include

использование пространства имен std ;

класс МойНовыйКласс {

общественный :

пустота мояФунк ( интервал на одной ) {

расчет << «Ценность такая» << на одной << конец ;

}

} ;

интервал основной ( ) {

пустота ( МойНовыйКласс ::* MyFuncPtr ) ( интервал ) '=' & МойНовыйКласс :: мояФунк ;

МойНовыйКласс Class_obj ;

( Класс_объект. * MyFuncPtr ) ( 10 ) ;

возвращаться 0 ;

}

Выход:



Это иллюстрирует работу указателей на функции-члены. Указатель функции-члена можно использовать для динамического запуска функций-членов в соответствии с текущими условиями.





Пример 2:

Чтобы упростить использование функций, определенных в заголовочном файле «iostream», мы включаем сюда «iostream». Следующим располагается пространство имен std. Под ним мы создаем класс «Test», а затем используем «публичный» конструктор. Мы определяем функцию-член «myTestingFunc» в «public» и устанавливаем «int t_value» в качестве параметра для «myTestingFunc()» в этом экземпляре. Ниже используется функция «cout» и вызывается метод main(). Затем мы создаем указатель на функцию-член.



Здесь мы указываем класс «Test» и указатель функции-члена «*MyTestFuncPtr». Мы присваиваем «&Test::myTestingFunc» указателю функции-члена, который объявлен как «void (Test::*MyTestFuncPtr)(int)».

Затем мы генерируем объект класса «t_obj» и используем его для вызова функции-члена, помещая объект класса и используя указатель «*MyTestFuncPtr». Чтобы это отображалось при вызове указателя функции-члена, мы назначаем «932» в качестве параметра.

Код 2:

#include

использование пространства имен std ;

классный тест {

общественный :

пустота myTestingFunc ( интервал t_value ) {

расчет << «Ценность тестирования» << t_value << конец ;

}

} ;

интервал основной ( ) {

пустота ( Тест ::* MyTestFuncPtr ) ( интервал ) '=' & Тест :: myTestingFunc ;

Тест t_obj ;

( t_obj. * MyTestFuncPtr ) ( 932 ) ;

возвращаться 0 ;

}

Выход:

Результат выполнения данного кода визуализируется. Мы видим, что мы вызвали «указатель функции-члена» с помощью объекта класса, как показано здесь.

Пример 3:

Класс, который мы генерируем в этом коде, — «MyNewCar», где мы используем «публичный» конструктор и создаем в нем функцию-член «startCarEngine()». В эту функцию мы добавляем «cout», который отображается, когда мы вызываем эту функцию в нашем коде. Затем мы создаем еще одну функцию-член «stopCarEngine()» и снова используем «cout» в этой функции-члене.

После этого мы вызываем функцию main(), а затем объявляем указатель на функцию-член «MyNewCar::*carEngineFunc()». Ниже мы создаем объект класса «MyNewCar» с именем «myCar_obj». Затем мы присваиваем функцию startCarEngine указателю carEngineFunc. Ниже мы вызываем эту функцию с помощью указателя «carEngineFunc», помещая в него имя объекта.

Далее мы переназначаем функцию «stopCarEngine» на указатель «carEngineFunc». Ниже мы вызываем эту функцию, передавая имя объекта вместе со ссылкой «carEngineFunc».

Код 3:

#include

использование пространства имен std ;

класс MyNewCar {

общественный :

пустота startCarEngine ( ) {

расчет << «Двигатель автомобиля заводится» << конец ;

}

пустота стопАвтомобильДвигатель ( ) {

расчет << «Двигатель автомобиля останавливается» << конец ;

}

} ;

интервал основной ( ) {

пустота ( Моя новая машина ::* автомобильДвигательFunc ) ( ) ;

MyNewCar myCar_obj ;

автомобильДвигательFunc '=' & Моя новая машина :: startCarEngine ;

( myCar_obj. * автомобильДвигательFunc ) ( ) ;

автомобильДвигательFunc '=' & Моя новая машина :: стопАвтомобильДвигатель ;

( myCar_obj. * автомобильДвигательFunc ) ( ) ;

возвращаться 0 ;

}

Выход:

Здесь отображается работа «указателя функции-члена». Мы видим, что мы создали указатель на функцию-член и отобразили здесь результат.

Пример 4:

После включения файла заголовка и пространства имен «std» мы объявляем здесь класс «MyNewStudent». Функция-член «studentPass()» — это одна из функций-членов, которые мы создаем для класса «MyStudentClass», который мы генерируем здесь. Мы также добавляем к этой функции «cout», которая будет отображаться, когда мы вызываем ее в нашем коде.

Далее мы пишем функцию-член «studentFail()», где снова используем «cout». Затем вызывается функция main() и объявляется указатель на функцию-член «(MyNewStudent::*studentResultFunc)()». Ниже мы генерируем объект «myStd_obj», который принадлежит классу «MyNewStudent».

Далее мы назначаем функцию «studentPass» указателю «studentResultFunc». Ниже мы вызываем эту функцию, передавая имя объекта вместе со ссылкой «studentResultFunc». Функция «studentFail» переназначается указателю «studentResultFunc». Ниже мы вызываем этот метод, указывая ссылку «carEngineFunc» и имя объекта.

Теперь здесь вызываются обе функции и обрабатываются операторы, которые мы включили в эти функции.

Код 4:

#include

использование пространства имен std ;

класс МойНовыйСтудент {

общественный :

пустота студенческий пропуск ( ) {

расчет << «Студенческий пропуск» << конец ;

}

пустота СтудентФэйл ( ) {

расчет << «Студент не справился» << конец ;

}

} ;

интервал основной ( ) {

пустота ( МойНовыйСтудент ::* СтудентРезультатФунк ) ( ) ;

МойНовыйСтудент myStd_obj ;

СтудентРезультатФунк '=' & МойНовыйСтудент :: студенческий пропуск ;

( myStd_obj. * СтудентРезультатФунк ) ( ) ;

СтудентРезультатФунк '=' & МойНовыйСтудент :: СтудентФэйл ;

( myStd_obj. * СтудентРезультатФунк ) ( ) ;

возвращаться 0 ;

}

Выход:

Мы создали функции-члены в нашем коде, а затем указатель на функцию-член. После этого мы вызвали функцию-член и отобразили здесь результат.

Пример 5:

В этом экземпляре создается «SampleClass». Затем сюда помещается указатель функции-члена, который имеет вид «(SampleClass::*MyFunc)()». Ниже мы создаем указатель на функцию «(*MyFuncPtr)()». Ниже мы объявляем «имя» «строковой» переменной, а также указатель на функцию-член «MyFunc f».

После этого у нас есть «публичный» конструктор, в котором мы определяем эту переменную функции-члена. Ниже мы создаем функции-члены с именами «myFunc_1()» и «myFunc_1()», а также добавляем «cout» в каждую функцию-член, которая будет отображаться при вызове этой функции-члена.

Затем мы вызываем указатель на эту функцию-член с помощью «(this->*f)()». Затем мы снова размещаем функции. Здесь мы меняем операторы «cout», которые мы добавили ранее. Затем вызывается «main()», и указатель функции-члена определяется как «MyFunc f = &SampleClass::myFunc_2».

Тогда указатель функции также определяется как «MyFuncPtr fp = myFunc_1». После этого мы набираем «(a.*f)()», чтобы использовать указатель функции-члена. «b.func» помещается для использования функции-члена. Затем мы помещаем «fp()» для вызова указателя функции.

Код 5:

#include

использование пространства имен std ;

класс SampleClass ;

определение типа пустота ( СэмплКласс ::* МояФунк ) ( ) ;

определение типа пустота ( * MyFuncPtr ) ( ) ;

класс SampleClass {

имя строки ;

MyFunc f ;

общественный :

СэмплКласс ( константа голец * имя )

: имя ( имя ) ,

ж ( & СэмплКласс :: мояФунк_1 )

{ }

пустота мояФунк_1 ( ) { расчет << имя << «Мы вызвали здесь функцию 1» << конец ; }

пустота мояФунк_2 ( ) { расчет << имя << «Здесь мы вызвали функцию 2» << конец ; }

пустота функция ( ) {

( этот ->* ж ) ( ) ;

}

} ;

пустота мояФунк_1 ( ) { расчет << «Первая функция» << конец ; }

пустота мояФунк_2 ( ) { расчет << «Вторая функция» << конец ; }

интервал основной ( )

{

MyFunc f '=' & СэмплКласс :: мояФунк_2 ;

MyFuncPtr fp '=' мояФунк_1 ;

ОбразецКласс a ( 'первый - ' ) , б ( 'второй - ' ) ;

( а. * ж ) ( ) ;

б. функция ( ) ;

фп ( ) ;

}

Выход:

Теперь здесь отображается результат выполнения кода, который отображает результат соответственно тому, как мы вызывали функции в нашем коде.

Заключение

Мы выяснили, что «указатели на функции-члены» в C++ упрощают динамическое связывание, инкапсуляцию поведения и гибкую обработку вызова функций в контексте ООП. Мы узнали, что использование «указателей на функции-члены» может значительно улучшить модульность и гибкость баз кода C++, предоставляя мощный инструмент для решения многочисленных проблем проектирования и выполнения.