Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
марсианин ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.054 c
1-1103285802
TUser
2004-12-17 15:16
2005.01.02
Не нравится мне мой код


14-1102779164
Человек
2004-12-11 18:32
2005.01.02
Music


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


3-1102314430
fisherman
2004-12-06 09:27
2005.01.02
Как лучше организовать архив на MSSQL сервере?


4-1100697957
R.O.O.T
2004-11-17 16:25
2005.01.02
ПОМОГИТЕ НАУЧИТЬСЯ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский