Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Использование 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() становится проще и понятнее. Информация, выводимая программой на экран, не изменилась.

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.