Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.022 c
1-1103190060
Garry_c
2004-12-16 12:41
2005.01.02
Пропало верхнее меню в окне. Как восстановить?


14-1102494768
truster
2004-12-08 11:32
2005.01.02
контейнерные файлы


14-1102996746
DelphiN!
2004-12-14 06:59
2005.01.02
Сжатие данных


1-1103285802
TUser
2004-12-17 15:16
2005.01.02
Не нравится мне мой код


11-1084605864
Alex^
2004-05-15 11:24
2005.01.02
Идентификация контроллов в KOL




   Наверх