C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как в BCB работать с процедурным типом?, ...и есть ли он вообще
juice
Отправлено: 10.02.2005, 20:42


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Как в BCB работать с процедурным типом?
Мне надо в зависимости от хода выполнения программы в опр. момент вызывать одну из множества функций. Хочу сделать переменную типа функция, присваивать ей настоящую функцию и запускать ее.
Как это сделать?
olegenty
Отправлено: 11.02.2005, 10:45


Ветеран

Группа: Модератор
Сообщений: 2412



процедурного типа С++ не поддерживает. тут всё более близко к реальной сути "процедурного" типа. вместо этого есть понятие "указатель на функцию", который, при разыменовании и выполнении опреатора "()" применительно к разыменованному указателю даёт "вызов" функции. поясню на примере:

CODE

class TfmUIForm;
typedef void __fastcall (__closure *TUnregisterFunc)(TfmUIForm*);


это определение типа TUnregisterFunc указателя на функцию-член некоего VCL класса, в данном случае — формы, с одним принимаемым параметром типа TfmUIForm* и возвращающую тип void (т.е. ничего не возвращающую)

использовать можно следующим образом:
1. Есть некая форма (для конкретного данного примера)
2. У неё объявлен метод UnregisterForm
CODE

   void __fastcall UnregisterForm(TfmUIForm*);

3. Есть некий другой модуль, из которого нужно вызвать метод UnregisterForm данной формы, не имея её определения
4. Для этого в модуле объявляется параметр
CODE

   TUnregisterFunc pUnregister;

5. В некотором месте он инициируется передачей указателя на функцию-член формы:
CODE

   pUnregister = UnregisterForm;

6. Затем, отложенно вызывается из модуля так:
CODE

   pUnregister(SomeValueOfPointerToTfmUIForm);


вуаля smile.gif
Asher
Отправлено: 11.02.2005, 11:27


Мастер участка

Группа: Модератор
Сообщений: 550



Проще обойтись классом с одной этой функцией в виде public метода и отнаследовать его столько, сколько надо.
Или вообще перегрузкой функций обойтись.
Все зависит от конкретного случая.
olegenty
Отправлено: 11.02.2005, 11:53


Ветеран

Группа: Модератор
Сообщений: 2412



пример надуманный, я от этого решения отказался, просто сорец остался, а код рабочий.

Вернуться в Вопросы программирования в C++Builder