Wskaźnik na funkcję klasy

0

Chcę utworzyć klasę, która obsługuje zdarzenia. W tym celu chcę podstawić do zdarzeń adresy funkcji innej klasy

czyli jakby
TNotifyEvent = procedure (Sender : TObject) of object

jak zadeklarować to w c++?

mam...

#include <cstdlib>
#include <iostream>

using namespace std;


class 
      TKomunikaty {
      public:
             
      void KomunikatPrzed(void *){
                   cout << "Komunikat przed funkcją" << endl;
      }

      void KomunikatZa(void *){
          cout << "Komunikat za funkcją" << endl;
      }

      void KomunikatTrzeci(void *){
           cout << "Można podmienić funkcję wewnętrzną" << endl;
      }
      
      };

class                  
      TKlasa {
             protected:
                  
             public:
                  void (*OnBeforeNapiszTekst)(void *);
                  void (*OnAfterNapiszTekst)(void *);
                   
                   void NapiszTekst(char *tekst) {
                        if (OnBeforeNapiszTekst)
                           OnBeforeNapiszTekst(this);
                           
                        cout << tekst << endl;
                        
                        if (OnAfterNapiszTekst)
                           OnAfterNapiszTekst(this);
                   };
             };




int main(int argc, char *argv[])
{
    TKlasa my_class;
    TKomunikaty kom;
    
    my_class.OnBeforeNapiszTekst = kom.KomunikatPrzed;
    my_class.OnAfterNapiszTekst = &KomunikatZa;
    
    my_class.NapiszTekst("Tekst");
    
    my_class.OnBeforeNapiszTekst = &KomunikatTrzeci;
    my_class.NapiszTekst("I teraz wszystko gra");
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
0

primo, aby wziac wskaznik na metode, trzeba podac PELNA nazwe

my_class.OnAfterNapiszTekst = &TKomunikat::KomunikatZa;
my_class.OnBeforeNapiszTekst = &TKomunikat::KomunikatTrzeci

secundo, KomunikatPrzed zwyklym member'em klasy i jest typu

void (TKomunikaty::*) (void*)

a nie

void (*) (void*)

a takiego typu oczekuja Twoje zmienne w klasie TKlasa.

najprosciej - uczyn metody "KomunikatPrzed" itp metodami statycznymi.

static void KomunikatPrzed(void *){....

i wtedy to ruszy. tylko pamietaj ze statyczne metody dzialaja w oderwaniu od obiektu i nie maja dostepu do normalnych metod i zmiennych tej klasy.

JESLI zas chcesz moc podpinac i wywolywac nie-statyczne metody obiektow jako reakcje na zdarzenia, zainteresuj sie funkcja boost::mem_fn, dostepna w Booscie i pamietaj ze <url>zwykle metody wymagaja podania obiektu jako pierwszego parametru</url>

edit: mem_fn i funktorami i template'ami i interfejsami i (..)

edit2: hm.. kolejny temat na artykul..

1 użytkowników online, w tym zalogowanych: 0, gości: 1