Студопедия

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

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

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






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

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

     






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