Программирование >>  Дополнительные возможности наследования 

1 ... 135 136 137 [ 138 ] 139 140 141 ... 265


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 ; } } ;



1 ... 135 136 137 [ 138 ] 139 140 141 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика