Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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&); Это вид объявлений, который используется крайне редко и заставляет программистов обращаться к книгам каждый раз, когда нечто подобное встречается в тексте. Но временами данный подход позволяет значительно усовершенствовать код программы, как в нашем примере.
|