Студопедия

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

КАТЕГОРИИ:

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






Листинг 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&);

Это вид объявлений, который используется крайне редко и заставляет программистов обращаться к книгам каждый раз, когда нечто подобное встречается в тексте. Но временами данный подход позволяет значительно усовершенствовать код программы, как в нашем примере.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал