|
Программирование >> Дополнительные возможности наследования
1 4 (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 1 IK < . x: 1 y: 2 New value for ValOne: 2 New value for ValTwo: 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 y: 729 x: 729 у: 64 (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 0 Функции работают так же, как и в листинге 14.5. Информация, выводимая * - - профаммой на экран, также не изменилась. Но размер профаммы увели- чился с 22 до 46 сфок. Причина в том, что вызов функции PгintVals()пpиxoдитcя повторять для каждого блока с оператором case. Заманчивым может показаться вариант размешения функции PrintValsO вверху и внизу цикла while, а не в каждом блоке с оператором case. Но тогда функция PrintValsO будет вызываться даже в случае выхода из цикла, чего быть не должно. Упрощенный вароант оызова функцоо Имя указателя на функцию вовсе не должно дублировать имя самой функции, хотя вы вполне вправе это сделать. Пусть, например, pFunc-указатель на функцию, принимающую целочисленное значение и возвращающую переменную типа long, и имя этой функции - pFunc. У вас есть возможность вызвать ее любым из двух обращений: ( pFunc) (х); Оба выражения приведут к одному и тому же результату. Хотя первое выражение короче, второе придает программе больше гибкости. Увеличение размера кода за счет повторяющихся вызовов одной и той же функции ухудшает читабельность профаммы. Этот вариант приведен специально для того, чтобы показа эффективность использования указателей на функции. В реальных условиях преимущества применения указателей на функции еще более очевидны, так как они позволяют исключить дублирование кода и делают профамму более четкой. Например, указатели на функции можно собрать в один массив и вызывать из него функции в зависимости от текущей ситуации. Массивы указатвлви на функции Аналогично объявлению массива указателей целых чисел можно объявить массив указателей на функции с определенной сигнатурой, возвращающих значения определенного типа. Листинг 14.7 является еще одним вариантом профаммы из листинга 14.5, в которой все указатели на функции собраны в массив. Аистинг 14.7. Исподьзованне массива указате еО на функции 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Листинг 14.7. Пример использования массива указателей на функции #include <iostream.h> void Square (int&,int&); void Cube (int&, int&); void Swap (int&, int &); void GetVals(int&, int&); void PrintVals(int, int); int main() { int val0ne=1, valTwo=2; int choice, i; const MaxArray = 5; void (*pFuncArray[MaxArray])(int&, int&); for (i=0;i<MaxArray;i++) { cout (l)Change Values (2)Square (3)Cube (4)Swap: ; cin >> choice; switch (choice) { case 1:pFuncArray[i] = GetVals; break; case 2:pFuncArray[i] = Square; break; case 3:pFuncArray[i] = Cube; break; case 4:pFuncArray[i] = Swap; break; default;pFuncArray[i] = 0; for (1=0; KMaxArray; i++) { if ( pFuncArray[i] == 0 ) continue; pFuncArray[i](valOne, valTwo); PrintVals(valOne,valTwo); return 0; void PrintVals(int x, int y) { cout x: X y: у endl; void Square (int & rX, int & rY) { . rX .= rX; 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 rY .= rY; > void Cube (int & rX, int & rY) { int tmp; tmp = rX; rX .= rX; rX = rX ♦ tmp; tmp = rY; rY .= rY; rY = rY * tmp; void Swap(int & rX, int & rY) { int temp; temp = rX; rX = rY; rY = temp; void GetVals (int & rValOne, int & rValTwo) { cout New value for ValOne; ; cin rValOne; cout New value for ValTwo; ; cin rValTwo; (l)Change Values (2)Square (3)Cube (4)Swap: 1 (l)Change Values (2)Square (3)Cube (4)Swap: 2 (l)Change Values (2)Square (3)Cube (4)Swap; 3 (l)Change Values (2)Square (3)Gube (4)Swap; 4 (l)Change Values (2)Square (3)Cube (4)Swap; 2 New Value for ValOne: 2 New Value for ValTwo; 3 x: 2 y: 3 x: 4 y: 9 x: 64 y: 729 x; 729 y: 64 x: 531441 у;4096 Как и в предыдущем листинге, для экономии места не были показаны выполнения объявленных функций, поскольку сами функции остались теми же, что и в листинге 14.5. В строке 16 объявляется массив pFuncArray, содержащий пять указателей на функции, которые возвращают void и принимают две ссылки на значения типа int.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |