Вниз
Скачать: 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
4-1100169917
Unnicked
2004-11-11 13:45
2005.01.02
Информация о процессах


3-1102079411
stud
2004-12-03 16:10
2005.01.02
ошибка в базе данных фб1,5


4-1100788234
Jay
2004-11-18 17:30
2005.01.02
Beeper


1-1103184634
aleshap
2004-12-16 11:10
2005.01.02
Каким образом можно сбросить буфер нажатых клавиш


1-1103143149
Raider
2004-12-15 23:39
2005.01.02
Использование динамически созданного TRichEdt а




   Наверх