БлогNot. Указатель на функцию или делегат...

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

Указатель на функцию или делегат...

В консольном проекте 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++;
}

Здесь рисуется простейшая не-масштабируемая по размерам канвы синусоида. Передав другого "делегата", можно динамически изменить работу программы.


теги: графика программирование c++ studio

03.02.2014, 15:13; рейтинг: 8413

  свежие записипоиск по блогукомментариистатистика

Наверх Яндекс.Метрика
© PerS
вход