Указатель на функцию или делегат...
В консольном проекте Visual Studio можно использовать, при желании, обычные указатели на функции:
#include <stdlib.h> #include <stdio.h> #include <string.h> using namespace std; typedef int (* function) (int,int); function sf; int f1 (int a, int b) { return a+b; } int f2 (int a, int b) { return a-b; } int main (void) { sf=f1; printf ("\nsf=%d",sf(2,1)); sf=f2; printf ("\nsf=%d",sf(2,1)); getchar(); return 0; }
Здесь предполагается, что создан пустой проект без каких-либо подключаемых файлов и в него добавен файл .cpp
(правда, коды из этого примера едва ли без переделки сработают в Studio, в Builder должны).
А вот в C++/CLI с Windows Forms, видимо, лучше работать с делегатами.
"Для повышения безопасности" C++/CLI, по сути дела, не даёт работать с указателями напрямую, в частности, с указателями на функции тоже. Взамен созданы классы, позволяющие моделировать работу указателей. Так, вместо указателей на функции разработчики .NET придумали понятие делегата. Делегат — это особый вид класса. Создав объект делегата, можно инкапсулировать в него указатель на нужный метод. Инкапсуляция в делегат указателя на метод делает такой указатель безопасным, так как управляемый объект-делегат контролируется системой.
Пример рисования на канве формы и создания аналога указателя на функцию через "делегата":
//В классе form1 прописали глобальный член: public: delegate double DelegatePtr ( double); //Функция, указатель на которую будем передавать функции рисования private: double f (double x) { return Math::Sin(x); } //Этот код выполняем в какой-либо функции, например, по щелчку кнопки: DelegatePtr^ arrayDelegate = gcnew DelegatePtr(this,&Form1::f); Color ^col = gcnew Color(); Pen ^pen = gcnew Pen (col->Red); System::Drawing::Graphics ^ im=this->CreateGraphics(); im->Clear(col->White); float x1=0,y1=0,x2=0,y2; while (x2<this->Width) { y2=arrayDelegate(x2)*100; if (y2<0) y2*=-1; im->DrawLine(pen,x1,y1,x2,y2); x1=x2;y1=y2;x2++; }
Здесь рисуется простейшая не-масштабируемая по размерам канвы синусоида. Передав другого "делегата", можно динамически изменить работу программы.
03.02.2014, 15:13 [10871 просмотр]