Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

С++ и события   Найти похожие ветки 

 
марсианин ©   (2004-12-13 14:41) [0]

если мы на делфи пишем так:


type TMyEvent = procedure (n:integer) of object;
причем парамтр типа TMyEvent можно пихать в функцию..

напр.
type TMyClass = class
   procedure some_proc(n:integer);
end;
......
procedure do_smth( action:TMyEvent)
begin
  .....
  if (assigned(action)) then action(n);
  .....
end;
......
//вызов
var mc:TMyClass;
.....
do_smth(mc.some_proc);
....



есть ли такое в С++?
единствненное, чего приходит на ум - это
вместо TMyEvent будем передавать свой класс с виртуальной функцией..


struct CMetod
{
  virtual void execute( int n) = 0;
};

class my_class
{
   void some_proc(int i) ;

   friend class CMyMethod;
public:
   class CMyMethod :public CMetod
   {
      my_class * ptr;
   public:  
      CMyMethod(my_class * pthis) : ptr(pthis)
      {}

      virtual void execute( int n)
      {
          ptr->some_proc(n);
      }
   };
.......
};

....
void do_smth( CMetod * action)
{
  .....
  if (!action) action->execute(n);
  .....
}
......
//вызов
my_class mc;
.....
my_class::CMyMethod act(&mc);
CMetod *pa = dynamic_cast <CMetod *> (&act); //наверное, можно и без dynamic_cast
do_smth(pa);
....


это работает, но как-то, ИМХО, через задницу..
может, есть способ лучше??
неужели там нет аналога type TMyEvent = procedure (n:integer) of object;???


 
wicked ©   (2004-12-13 14:44) [1]

в билдере - __closure...
в классическом си++ - искать по ключевому слову closure, есть статьи и примеры с использованием шаблонов...


 
марсианин ©   (2004-12-13 15:16) [2]

чего? причем здесь это?
к тому же в индексе VS все равно этого нет..

на RSDN нашлась статья http://www.rsdn.ru/article/cpp/cxx_events.xml


 
Igorek ©   (2004-12-13 21:04) [3]


> неужели там нет аналога type TMyEvent = procedure
> (n:integer) of object;???

Есть аналоги в частных реализациях - тот же closure. А в чистом С++ нету of object.
void A::f(void) и void B::f(void) - имеют разные сигнатуры. А потому для указателей на них не существует типа.

> вместо TMyEvent будем передавать свой класс с
> виртуальной функцией..

Если тебе известен класс, то ты можешь прямо определить тип указателя на его метод и передавать/сохранять/вызывать.


 
марсианин ©   (2004-12-13 21:36) [4]


> Если тебе известен класс, то ты можешь прямо определить
> тип указателя на его метод и передавать/сохранять/вызывать.

о! как это сделать?


 
Igorek ©   (2004-12-14 01:40) [5]

марсианин ©   (13.12.04 21:36) [4]

> о! как это сделать?

Просто. Почитать про указатели на функции и про typedef. :-)



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.055 c
1-1103523038
Mishenka
2004-12-20 09:10
2005.01.02
Как в DBGridEh (из EhLib) сделать структуру как в TreeView?


3-1102268056
ks
2004-12-05 20:34
2005.01.02
Фильтрация записей в TTable


6-1097863368
ALex B.
2004-10-15 22:02
2005.01.02
Thread, Ping...


14-1102938911
Cobalt
2004-12-13 14:55
2005.01.02
Дельфи7 под MemProof


4-1100697304
cautur
2004-11-17 16:15
2005.01.02
Формат даты Windows