Главная страница
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.039 c
3-1102393055
Dmitriy O.
2004-12-07 07:17
2005.01.02
TRxDbGrid OnTitleClick


1-1103149768
den1s
2004-12-16 01:29
2005.01.02
добавление компанентов


14-1102860074
kai
2004-12-12 17:01
2005.01.02
всем ворам бы руки поотрубать...


1-1103111248
Пат
2004-12-15 14:47
2005.01.02
Как скопировать текст - FindWindowEX( SysListView32 );


1-1103263631
akhmadey
2004-12-17 09:07
2005.01.02
Delphi&amp;Excel