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



         

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


Указатель на функцию может также быть типом возвращаемого значения. Объявление подобной функции требует определённого навыка. Начнём с той части объявления, которая содержит имя функции и список её формальных параметров. ReturnerF(int, int)

Определим теперь тип указателя на функцию, который будет возвращаться функцией ReturnerF(int, int). char* (*)(int,int,int*,float)

Теперь остаётся правильно соединить обе части объявления. char* (*ReturnerF(int, int))(int,int,int*,float);

Получилась такая вот матрёшка. Функция о двух целочисленных параметрах, возвращающая указатель на функцию, которая возвращает указатель на объект типа char и имеет собственный список формальных параметров вида: (int,int,int*,float). Нет предела совершенству!

Самое сложное - это объявить прототип подобной функции. Всё остальное очень просто. При определении функции нужно помнить, что она (всего лишь) возвращает указатель на функцию, то есть просто имя функции. Разумеется, эта функция должна быть предварительно объявлена и определена, а её описание должно соответствовать характеристикам функции ReturnerF.

Есть такие функции! Здесь их целых три: MyFF1, MyFF2, MyFF3.

Приступаем к реализации и параллельно обыгрываем параметры. char* (*ReturnerF(int param1, int param2))(int,int,int*,float) { char* (*PointF) (int,int,int*,float); /* Это всего лишь указатель на функцию. Мы можем себе позволить этот пустяк. */ if (!param1) return NULL; switch param2 { case 1: PointF = MyFF1; break; case 2: PointF = MyFF2; break; case 3: PointF = MyFF3; break; default: PointF = NULL; break; } return PointF; }

Теперь только вызов! Наша функция возвращает адрес функции. И поэтому самое простое - это вызов функции непосредственно из точки возврата функции ReturnerF: int val1, val2; ::::: MyPointChar = (ReturnerF(val1,val2))(7,7,NULL,7.7); Всё было бы хорошо, если бы только не существовала вероятность возвращения пустого указателя. Так что придётся воспользоваться ранее объявленным указателем на функцию, проверять возвращаемое значение и только потом вызывать функцию по означенному указателю. Это не намного сложнее: MyPtArray[3] = ReturnerF(val1,val2); if (MyPtArray[3]) {MyPointChar = (MyPtArray[3])(7,7,NULL,7.7);} /* Вот и элемент массива указателей пригодился.*/

Настало время вспомнить о typedef-спецификаторе. С его помощью запись указателя на функцию можно сделать компактнее: typedef char* (*PPFF) (int,int,int*,float);

Здесь надо представлять всё ту же матрёшку. Замещающий идентификатор PPFF располагается внутри определяемого выражения. И вот новое объявление старой функции. PPFF ReturnerF(int, int);

В процессе трансляции будет восстановлен исходный вид объявления.




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