Читаем Освой самостоятельно С++ за 21 день. полностью

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&);

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

Использование typedef с указателями на функции

Конструкция void (*)(int&, int&) весьма громоздка. Для ее упрощения можно воспользоваться ключевым словом typedef, объявив новый тип (назовем его VPF) указателей на функции, возвращающие void и принимающие две ссылки на значения типа int. Листинг 14.9 представляет собой переписанную версию листинга 14.8 с использованием этого подхода.

Листинг 14.8. Использование оператора typedef для объявления типа указателей на функции

1: // Листинг 14.9. Использование typedef для

2: // объявления типа указателей на функции

3: #include

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: ";

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT