* Указател към функция
Публикувано на 14 ноември 2008 в раздел С/C++.
Указателите към функции водят до някои много интересни и ефективни програмни техники. Както подсказва името им – това са указатели, които сочат към адреса в паметта, където е записана дадена функция. Тук трябва да отбележим, че указателите към функции не са нововъведение от С++, а са известни още от много компилатори за С. Оказват се особено подходящи при извикване на „callbacks“ и за създаване на събития (events). Callback наричаме функция, която програмистът не е извикал изрично в програмния код. За тяхното изпълнение се грижи друга функция, която е приела указател към нейния адрес.
Дефиницирнето на указатели към фунции се получава по следният начин:
<тип връщан резултат> (*<име>) (<входни параметри>);
Пример: Дефинираме две функции max и min, които предаваме чрез указател на друга функция show, която ги изпълнява:
#include "stdafx.h"
#include "iostream.h"
void max(int a, int b){
cout << "the bigger number is: ";
cout << ((a>b)?a:b);
cout << endl;
}
void min(int a, int b){
cout << "the lower number is: ";
cout << ((a<b)?a:b);
cout << endl;
}
// show приема като трети параметър указател към
// функция, която е от тип void и е с входни параметри
// две числа от тип int
void show(int x, int y, void(*pFunc)(int, int)){
pFunc(x, y);
}
void main()
{
// Създаваме указател
void(*ptr2func)(int, int);
// Насочваме указателя към функцията max
ptr2func = max;
show(2 , 3 , ptr2func);
// Сега насочваме указателя към min
ptr2func = min;
show(2 , 3 , ptr2func);
}
От примера веднага става ясно, че синтаксисът не е много удобен за работа. Тук на помощ идва typedef, чрез който можем да зададем ново име на типа. Указателя от горният пример може да бъде създаден като тип по следния начин:
typedef void(*COMPARE)(int, int); // Сега можем да създаваме обекти от тип COMPARE COMPARE ptr2func;
Задача: Създайте функции plus, minus, multiply и divide, които приемат две числа от тип double и връщат като резултат съответно тяхния сбор, разлика, умножение и деление. Създайте указатели към тези функции и ги изпратете последователно като параметър на функция show, която отпечатва резултатът.
Пусни коментар
Категории
- Бази от Данни (39)
- Вероятности (30)
- История (14)
- Кучета (67)
- Лада Нива (91)
- Математика (158)
- Методика (52)
- Общи работи (107)
- ПИК-3 Java (38)
- Политика (40)
- Програмни Среди (1)
- ПТСК (37)
- С/C++ (45)
- Семейни (15)
- Физика (35)
- ХHTML/JS (25)
- Храна (11)
Нови
- Здравей бебе!
- Какво означават метеорологичните кодове?
- Берра проправя пътеки
- Задача от YES
- Колан за теглене на автомобил