Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Использование typedef с указателями на функции
Конструкция void (*)(int&, int&) весьма громоздка. Для ее упрощения можно воспользоваться ключевым словом typedef, объявив новый тип (назовем его VPF) указателей на функции, возвращающие void и принимающие две ссылки на значения типа int. Листинг 14.9 представляет собой переписанную версию листинга 14.8 с использованием этого подхода. Листинг 14.8. Использование оператора typedef для объявления типа указателей на функции 1: // Листинг 14.9. Использование typedef для 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: typedef void (*VPF) (int&, int&); 10: void PrintVals(VPF, int&, int&); 11: 12: int main() 13: { 14: int val0ne=1, valTwo=2; 15: int choice; 16: bool fQuit = false; 17: 18: VPF pFunc; 19: 20: while (fQuit == false) 21: { 22: cout < < " (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: "; 23: cin > > choice; 24: switch (choice) 25: { 26: case 1: pFunc = GetVals; break; 27: case 2: pFunc = Square; break; 28: case 3: pFunc = Cube; break; 29: case 4: pFunc = Swap; break; 30: default: fQuit = true; break; 31: } 32: if (fQuit == true) 33: break; 34: PrintVals (pFunc, valOne, valTwo); 35: } 36: return 0; 37: } 38: 39: void PrintVals(VPF pFunc, int& x, int& y) 40: { 41: cout < < " x: " < < x < < " y: " < < y < < endl; 42: pFunc(x, y); 43: cout < < " x: " < < x < < " y: " < < y < < 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 y: 2 New value for ValOne: 2 New value for ValTwo: 3 x: 2 y: 3 (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 3 x: 2 y: 3 x: 8 y: 27 (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 2 x: 8 y: 27 x: 64 y: 729 (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 4 x: 64 y: 729 x: 729 y: 64 (0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 0
Анализ: В строке 9 с помощью оператора typedef объявляется новый тип VPF как указатели на функции, возвращающие void и принимающие две ссылки на int. В строке 10 объявляется функция PrintVals(), которая принимает три параметра: VPF и две ссылки на integer. В строке 18 указатель Pfunc объявляется как принадлежащий TnnyVPF. После объявления типа VPF дальнейшее использование указателя pFunc и функции PrintVals() становится проще и понятнее. Информация, выводимая программой на экран, не изменилась.
|