Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
32
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Пример №2

/*Вызов функций по адресам через указатель

*/

#include<iostream.h>

// описания функций

// функции одного типа с одинаковыми сигнатурами

int add (int n, int m) { return n + m;}

int div (int n, int m) { return n % m;}

int mult (int n, int m) { return n * m;}

int subt (int n, int m) { return n - m;}

void main()

{

int (*par)(int, int); // указательна функцию

int a = 6, b = 2; /* задаются начальные значения

для переменных a и b */

char c = '+';

while(c != ' ')

{

cout << "\nАргументы: а = " << a

<< ", b = " << b;

cout << "\n Результат для с = \'" << c << "\'"

<< " равен ";

switch(c)

{

case '+':

par = add; // par получает адрес функции add

c = '%'; break;

case '-':

par = subt; // par получает адрес функции subt

c = ' '; break;

case '*':

par = mult; // par получает адрес функции mult

c = '-'; break;

case '%':

par = div; // par получает адрес функции div

c = '*'; break;

}

cout << (*par)(a,b); /* вызов функции по адресу,

результат, возвращаемый функцией, выводится на экран */

}

cout << endl;

}

Результат выполнения программы

Аргументы: a = 6, b = 2. Результат для с = '+' равен 8

Аргументы: a = 6, b = 2. Результат для с = '%' равен 0

Аргументы: a = 6, b = 2. Результат для с = '*' равен 12

Аргументы: a = 6, b = 2. Результат для с = '-' равен 4

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

Указатели на функции могут быть объединены в массивы. Например, float (*ptrArray) (char) [4] ; - описание массива с именем ptrArray из четырех указателей на функции, каждая из которых имеет параметр типа char и возвращает значение типа float. Чтобы обратиться, например, к третьей из этих функций, потребуется такой оператор:

float a = (*ptrArray[2]) ('f');

Как обычно, индексация массива начинается с 0, и поэтому третий элемент массива имеет индекс 2.

Массивы указателей на функции удобно использовать при разработке всевозможных меню, точнее программ, управление которыми выполняется с помощью меню. Для этого действия, предлагаемые на выбор будущему пользователю программы, оформляются в виде функций, адреса которых помещаются в массив указателей на функции. Пользователю предлагается выбрать из меню нужный ему пункт и по номеру пункта, как по индексу, из массива выбирается соответствующий адрес функции. Обращение функции к этому адресу обеспечивает выполнение требуемых действий. Самую общую схему реализации такого подхода иллюстрирует следующая программа.

Пример №3

/*пример с массивом указателей на функции

*/

#include<iostream.h>

// объявление функций

void func1(int);

void func2(int);

void func3(int);

void main()

{

/* объявление массива, в котором хранятся указатели на

функции func1, func2 и func3*/

void (*f[3])(int) = {func1, func2, func3};

int choice;

cout << "Введите число между 1 и 3,"

" другое число - окончание: ";

cin >> choice;

while(choice >= 1 && choice < 4)

{

(*f[choice-1])(choice); // вызов функции f[choice]

cout << "Введите число между 1 и 3,"

" другое число - окончание: ";

cin >> choice;

}

cout << "Вы ввели " << choice << " для окончания\n";

}

// описания функций

void func1(int a)

{

cout << "\nВы ввели " << a

<< ", поэтому была вызвана func1\n";

}

void func2(int b)

{

cout << "\nВы ввели " << b

<< ", поэтому была вызвана func2\n";

}

void func3(int a)

{

cout << "\nВы ввели " << a

<< ", поэтому была вызвана func3\n";

}