* Указател към функция

Публикувано на 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, която отпечатва резултатът.



RSS за коментарите

Пусни коментар