|
Программирование >> Дополнительные возможности наследования
12: int mainO 13: { 14: int valOne=1, valTwo=2; 15: int choice; 16; bool fOuit = false; 18; VPF pFunc; 19: 20: while (fQuit == false) 21; { 22: cout (O)Quit (l)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 = Gube; 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: } 39: void PrintVals( VPF pFunc,lnt& 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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 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; : (O)Quit (l)Change Values (2)Square (3)Cub6 (4)Swap: 1 x: 1 y: 2 New value for ValOne: 2 New value for ValTwo: 3 x: 2 y: 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)Cub6 (4)Swap: 4 x: 64 y: 729 x: 729 y: 64 (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 0 В строке 9 с помощью оператора typedef объявляется новый тип VPF как указатели на функции, возвращающие void и принимающие две ссылки на int. В строке 10 объявляется функ1хия PrintVals(), которая принимает три параметра: VPF и две ссылки на integer. В строке 18 указатель Pfunc объявляется как принадлежащий типу VPF. После объявления типа VPF дальнейшее использование указателя pFunc и функции PrintValsO становится проще и понятнее. Информация, выводимая программой на экран, не изменилась. Указатели на функции-члены До настоящего времени все создаваемые указатели на функции использовались для общих функций, не принадлежащих к какому-нибудь одному классу. Однако разрешается создавать указатели и на функции, являющиеся членами классов (методы). Для создания такого указателя используется тот же синтаксис, что и для указателя на обычную функцию, но с добавлением имени класса и оператора области видимости (::). Таким образом, объявление указателя pFunc на функции-члены класса Shape, принимающие два целочисленньк параметра и возвращающие void, выглядит следующим образом: void (Shape::*pFunc) (int,int); Указатели на функции-члены используются так же, как и рассмотренные ранее указатели простых функции. Единственное отличие состоит в том, что для вызова функции необходимо наличие объекта соответствующего класса, для которого вызываются функции. В листинге 14.10 показано использование указателя на метод класса. Аистииг 14.10. Указатеди на функцин-чдены 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 Листинг 14.10. Указатели на виртуальные функции-члены Sinclude <iostream.h> class Mammal { public: MammalO :itsAge(1) { } virtual MammalO { } virtual void SpeakO const = 0; virtual void Move() const = 0; protected: int itsAge; } ; class Dog : public Mammal { public: void SpeakOconst { cout Woof!\ n ; } void MoveO const { cout Walking to heel...\ n ; } } ; class Cat : public Mammal { public: void SpeakOconst { cout Meow!\ n ; } void MoveO const { cout << slinking... \ n ; } class Horse : public Mammal { public: void SpeakOconst { cout Whinny!\ n ; } void MoveO const { cout Galloping. . .\ n ; } } ;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |