C++.Бархатный путь




Тип функции - часть 3


Значением выражения MyPT3 является адрес функции.

А вот каким образом описывается массив указателей на функцию: char* (*MyPtArray[3]) (int, int, int*, float); Здесь описан массив указателей из 3 элементов. Инициализация массива указателей возможна лишь после объявления трёх однотипных функций: extern char* MyFF1 (int, int, int*, float); extern char* MyFF2 (int, int, int*, float); extern char* MyFF3 (int, int, int*, float); char* (*MyPtArray[3]) (int, int, int*, float) = { MyFF1, MyFF2, MyFF3 }; // Инициализация массива указателей.

Вызов функции (например, MyFF3()) с помощью элемента массива указателей можно осуществить следующим образом: char* MyPointChar = MyPtArray[2](7,7,NULL,7.7);

Указатель на функцию может быть описан как параметр функции: void MonitorF(int,int,int*,float,char*(*)(int,int,int*,float)); // Торжество абстрактного описателя!

И этому параметру можно присвоить значение (значение по умолчанию): void MonitorF(int,int,int*,float,char*(*)(int,int,int*,float)=MyFF1);

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

А вот как может выглядеть определение функции MonitorF: #include <assert.h> /* Заголовочный файл, содержащий макроопределение assert. Это макроопределение преобразуется в условный оператор if. Если в ходе проверки значение условного выражения оказывается равным нулю, то происходит прерывание выполнения программы. */ void MonitorF ( int val1, int val2, int* pVal, float fVal, char*(*pParF)(int,int,int*,float) ) { char* pChar; assert(pVal != NULL); assert(pParF != NULL); //Это всего лишь проверка того, не являются ли указатели пустыми... pChar = pParF(val1, val2, pVal, fVal); }

Возможные варианты вызова этой функции: int MMM; int* pIval = &MMM; /* Указатель pIval используется для инициализации третьего параметра. */ MMM = 100; /* А значение объекту, на который настроен указатель pIval, может быть изменено в любой момент. */ MonitorF(9,9,pIval,9.9); /* При вызове используем значение указателя на функцию, присвоенное последнему параметру по умолчанию. */ MonitorF(11,11,pIval,11.11,MyFF3); /* А теперь передаём адрес новой функции.*/




Содержание  Назад  Вперед