|
Программирование >> Дополнительные возможности наследования
в строках 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&);
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.073
При копировании материалов приветствуются ссылки. |