![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Массивы указателей на функцииСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Аналогично объявлению массива указателей целых чисел можно объявить массив указателей на функции с определенной сигнатурой, возвращающих значения определенного типа. Листинг 14.7 является еще одним вариантом программы из листинга 14.5, в которой все указатели на функции собраны в массив. Листинг 14.7. Использование массива указателей на функции 1: // Листинг 14.7. Пример использования массива указателей на функции 2: 3: #include <iostream.h> 4: 5: void Square (int&,int&); 6: void Cube (int&, int&); 7: void Swap (int&, int &); 8: void GetVals(int&, int&); 9: void PrintVals(int, int); 10: 11: int main() 12: { 13: int valOne=1, valTwo=2; 14: int choice, i; 15: const MaxArray = 5; 16: void (*pFuncArray[MaxArray])(int&, int&); 17: 18: for (i=0;i<MaxArray;i++) 19: { 20: cout << "(1)Change Values (2)Square (3)Cube (4)Swap: "; 21: cin >> choice; 22: switch (choice) 23: { 24: case 1:pFuncArray[i] = GetVals; break; 25: case 2:pFuncArray[i] = Square; break; 26: case 3:pFuncArray[i] = Cube; break; 27: case 4:pFuncArray[i] = Swap; break; 28: default:pFuncArray[i] = 0; 29: } 30: } 31: 32: for (i=0;i<MaxArray; i++) 33: { 34: if (pFuncArray[i] == 0) 35: continue; 36: pFuncArray[i](valOne,valTwo); 37: PrintVals(valOne,valTwo); 38: } 39: return 0; 40: } 41: 42: void PrintVals(int x, int у) 43: { 44: cout << "x: " << x << " у: " << у << endl; 45: } 46: 47: void Square (int & rX, int & rY) 48: { 49: rX *= rX; 50: rY *= rY; 51: } 52: 53: void Cube (int & rX, int & rY) 54: { 55: int tmp; 56: 57: tmp = rX; 58: rX *= rX; 59: rX = rX * tmp; 60: 61: tmp = rY; 62: rY *= rY; 63: rY = rY * tmp; 64: } 65: 66: void Swap(int & rX, int & rY) 67: { 68: int temp; 69: temp = rX; 70: rX = rY; 71: rY = temp; 72: } 73: 74: void GetVals (int & rValOne, int & rValTwo) 75: { 76: cout << "New value for ValOne: "; 77: cin >> rValOne; 78: cout << "New value for ValTwo: "; 79: cin >> rValTwo; 80: }
Результат: (1)Change Values (2)Square (3)Cube (4)Swap: 1 (1)Change Values (2)Square (3)Cube (4)Swap: 2 (1)Change Values (2)Square (3)Cube (4)Swap: 3 (1)Change Values (2)Square (3)Cube (4)Swap: 4 (1)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 y:4096
Анализ: Как и в предыдущем листинге, для экономии места не были показаны выполнения объявленных функций, поскольку сами функции остались теми же, что и в листинге 14.5. В строке 16 объявляется массив pFuncArray, содержащий пять указателей на функции, которые возвращают void и принимают две ссылки на значения типа int. В строках 18-30 пользователю предлагается установить последовательность вызова функций. Каждый член массива связывается с соответствующей функцией. Последовательный вызов функции осуществляется в строках 32-38, причем после каждого вызова на экран сразу выводится результат.
Передача указателей на функции в другие функции
Указатели на функции (или массивы указателей) могут передаваться в другие функции для вызова в них с помощью указателя нужной функции. Листинг 14.5 можно усовершенствовать, передав указатель на выбранную функцию другой функции (кроме main()), которая выведет исходные значения на печать, вызовет функцию и вновь напечатает измененные значения. Именно такой подход применен в листинге 14.8. Листинг 14.8. Передана указателя на функцию другой функции 1: // Листинг 14.8. Передача указателя на функцию другой функции 2: 3: #include <iostream.h> 4: 5: void Square (int&,int&); 6: void Cube (int&, int&); 7: void Swap (int&, int &); 8: void GetVals(int&, int&); 9: void PrintVals(void (*)(int&, int&),int&, int&); 10: 11: int main() 12: { 13: int val0ne=1, valTwo=2; 14: int choice; 15: bool fQuit = false; 16: 17: void (*pFunc)(int&, int&); 18: 19: while (fQuit == false) 20: { 21: cout << "(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: "; 22: cin >> choice; 23: switch (choice) 24: { 25: case 1:pFunc = GetVals; break; 26: case 2:pFunc = Square; break; 27: case 3:pFunc = Cube; break; 28: case 4:pFunc = Swap; break; 29: default:fQuit = true; break; 30: } 31: if (fQuit == true) 32: break; 33: PrintVals (pFunc, valOne, valTwo); 34: } 35: 36: return 0; 37: } 38: 39: void PrintVals(void (*pFunc)(int&, int&),int& x, int& у) 40: { 41: cout << "x: " << x << " у: " << у << endl; 42: pFunc(x,у); 43: cout << "x: " << x << " у: " << у << endl; 44: } 45: 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: } 64: 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: }
Результат: (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 1 x: 1 у: 2 New value for Val0ne: 2 New value for ValTwo: 3 x: 2 у: 3 (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 3 x: 2 у: 3 x: 8 у: 27 (O)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 2 x: 8 у: 27 x: 64 у: 729 (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 4 x: 64 у: 729 x: 729 y:64 (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 0
Анализ: В строке 17 объявляется указатель на функцию pFunc, принимающую две ссылки на int и возвращающую void. Функция PrintVals, для которой задается три параметра, объявляется в строке 9. Первым в списке параметров стоит указатель на функцию, возвращающую void и принимающую две ссылки на int. Второй и третий параметры функции PrintVals представляют собой ссылки на значения типа int. После того как пользователь выберет нужную функцию, в строке 33 происходит вызов функции PrintVals. Спросите у знакомого программиста, работающего с C++, что означает следующее выражение: void PrintVals(void (*)(int&, int&), int&, int&); Это вид объявлений, который используется крайне редко и заставляет программистов обращаться к книгам каждый раз, когда нечто подобное встречается в тексте. Но временами данный подход позволяет значительно усовершенствовать код программы, как в нашем примере.
|
||
Последнее изменение этой страницы: 2016-12-10; просмотров: 590; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.99.16 (0.01 с.) |