Программирование >>  Дополнительные возможности наследования 

1 ... 134 135 136 [ 137 ] 138 139 140 ... 265


в строках 18-30 пользователю предлагается установить последовательность вызова функций. Каждый член массива связывается с соответствующей функцией. Последовательный вызов функции осуществляется в строках 32-38, причем после каждого вызова на экран сразу выводится результат.

Передача указателей на функции в другие функции

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

Листинг 14.5 можно усовершенствовать, передав указатель на выбранную функцию другой функции (кроме mainO), которая выведет исходные значения на печать, вызовет функцию и вновь напечатает измененные значения. Именно такой подход применен в листинге 14.8.

Аистинг 14.8. Передача указатедя иа фуикцип ypyzoD фуикции

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

Листинг 14.8. Передача указателя на функцию другой функции

Sinclude <iostream.h>

void Square (int&,int&); void Cube (int&, int&); void Swap (int&, int &); void GetVals(int&, int&);

void PrintVals(void (.)(int&, int&),int&. int&);

int mainO {

int val0ne=1, valTwo=2;

int choice;

bool fQuit = false;

void (*pFunc)(int&, int&);

while (fQuit == false) {

cout (OjOuit (l)Change Values (2)Square (3)Cube (4)Swap: cin choice; switch (choice) {

case 1:pFunc = GetVals; break; case 2;pFunc = Square; break; case 3:pFunc = Cube; break; case 4:pFunc = Swap; break; default:fQuit = true; break;

if (fQuit == true) break;

PrintVals ( pFunc, valOne, valTwo);



36: return 0;

37: }

39: void PrintVals( void (.pFunc)(int8., int8.),int& x, int& y) 40: {

41: cout x: x y: у endl; 42: pFunc(x,y);

43: cout x: x y: у endl;

44: }

46: void Square (int & rX, int & rY) 47: {

48: rX .= rX; 49: rY .= rY; 50: } 51:

52: void Cube (int & rX, int & rY) 53: {

54: int tmp; 55:

56: tmp = rX; 57: rX .= rX; 58: rX = rX . tmp; 59:

60: tmp = rY;

61: rY *= rY;

62: rY = rY tmp;

63: }

65: void Swap(int & rX, int & rY) 66: {

67: int temp; 68: temp = rX; 69; rX = rY; 70: rY = temp; 71: } 72:

73: void GetVals (int & rValOne, int & rValTwo) 74: {

75: cout New value for ValOne: ;

76: cin rValOne;

77: cout New value for ValTwo: ;

78: cin rValTwo;

79: }

-fpi (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 1 x: 1 y: 2

New value for ValOne: 2 New value for ValTwo: 3



- х: 2 у: 3

(O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 3 x: 2 y: 3 x: 8 y: 27

(O)Quit (l)Change Values (2)Square (3)Cube (4)Swap; 2 x: 8 y: 27 x: 64 y: 729

(O)Quit (l)Change Values (2)Square (3)Cube (4)Swap; 4 x: 64 у: 729 x: 729 y:64

(O)Quit (DChange Values (2)Square (3)Cube (4)Swap; 0

В строке 17 объявляется указатель на функцию pFunc, принимающую две ссылки на int и возвращающую void. Функция PrintVals, для которой задается три параметра, объявляется в строке 9. Первым в списке параметров стоит указатель на функцию, возвращающую void и принимающую две ссылки на int. Второй и третий параметры функции PrintVals представляют собой ссылки на значения типа int. После того как пользователь выберет нужную функцию, в строке 33 происходит вызов функции PrintVals.

Спросите у знакомого программиста, работающего с С++, что означает следующее выражение:

void PrintVals(void (.)(int&, int&), int&, int&);

Это вид объявлений, который используется крайне редко и заставляет программистов обращаться к книгам каждый раз, когда нечто подобное встречается в тексте. Но временами данный подход позволяет значительно усоверщенствовать код программы, как в нашем примере.

ИшАЬЗование typedef с указателями на функции

Конструкция void (*)(int&, int&) весьма громоздка. Для ее упрощения можно воспользоваться ключевым словом typedef, объявив новый тип (назовем его VPF) указателей на функции, возвращающие void и принимающие две ссылки на значения типа int. Листинг 14.9 представляет собой переписанную версию листинга 14.8 с использованием этого подхода.

Аистняг 14.1. Нсиодьзояанне онсратора typedef удя объявдення юнна указатедеО на фн В1н

1: Листинг 14.9. Использование typedef для

2: обьявления типа указателей на функции

3: sinclude <iostream.h> 4:

5: void Square (int&,int&);

6: void Cube (int&, int&);

7: void Swap (int&, int &);

8: void GetVals(int&, int&);

9: typedef void (VPF) (int&, int&) ;

10: void PrintVals(VPF,int&, int&);



1 ... 134 135 136 [ 137 ] 138 139 140 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.073
При копировании материалов приветствуются ссылки.
Яндекс.Метрика