Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++/CLI mit .NET ::  Funktionspointer zu Memberfunktion beliebiger Klasse     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
immapoint
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.03.2012
Beiträge: 2
Beitrag immapoint Mitglied 18:10:04 28.03.2012   Titel:   Funktionspointer zu Memberfunktion beliebiger Klasse            Zitieren

Hallo,

ich komme gleich zur Sache:

Ich bastle mir zur Zeit eine Art Framework besierend auf der SDL um damit später diverse Spiele zu entwickeln, ich habe da so einige Ideen. ;D

Auf jeden Fall arbeite ich im Moment an einer Art Eventsystem, das in etwa so aussieht:

Jede Klasse, die irgendwie Events behandeln soll, baut auf eine Basisklasse auf, die im Prinzip nichts anderes macht als sicherzustellen dass der Eventhandler der erbenden Klasse aufgerufen wird, dazu muss im Konstruktor der Klasse allerdings der Aufruf
C++:
((MGDK_App *) MGDK_Setup::app )->RegisterEvent(this);

erfolgen. Dieser registriert (offensichtlich..) die Klasse als Eventklasse und führt dann, immer wenn es ein Event zu behandeln gibt, die virtuelle Funktion HandleEvents(SDL_Event *, bool *) aus. 1. Argument enthält alle relevanten Informationen zum Event, der Pointer auf den Boolean wird zum Beenden nach der Ausführung des EventLoops benutzt (*quit = true würde nach dem durchlauf aller Eventhandler das Programm beenden, sofern der EventLoop das letzte Element im Programm ist.)

Naja, jetzt zum eigentlichen Problem.

Ich habe eine Klasse entworfen, die später einen Button auf dem Bildschirm darstellt und natürlich auch die Events von diesem Behandelt.

Die HandleEvents-Funktion sieht zur Zeit so aus:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
void MGDK_GuiButton::HandleEvents(SDL_Event *evnt, bool *quit){
 
    switch ( evnt->type ){
 
        case SDL_MOUSEBUTTONDOWN:
 
            if ( this->mbdown != NULL )this->mbdown(evnt, quit);
 
 
    }
 
}


Die Funktion ruft im Grunde nur den Funktionspointer mbdown mit der Eventstruktur und dem Terminierungsboolean (klasse Name, ich weiß :>)(void (*mbdown) (SDL_Event *, bool *);) auf, sofern der nicht NULL ist.

Hier kommts zum Problem. Man könnte da jetzt jede erdenkliche Nicht-Member-Funktion einsetzten, allerdings möchte ich die ganze Sache etwas nach dem Signal-Slot-Konzept vom Qt richten, d.h., man kann mittels einer Funktion ein Signal("Aktion") mit einem Slot("Reaktion") verbinden. In dem Fall hier wäre die Aktion dann das Klicken auf den Button, die Reaktion das Aufrufen des Voidpointers.

Das stellt soweit kein Problem dar, solange ich, wie oben beschrieben, Nicht-Member-Funktion einsetze. Ich würde es aber gerne wie folgt konzipieren:


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Slot{ public: void mbdown(SDL_Event *, bool *); };
void Slot::mbdown( SDL_Event *evnt, bool *quit ){
     //irgendwelche Daten verändern etc.
}
 
class Signal : public MGDK_EventObject{
   public:
      Signal();
      void HandleEvents(SDL_Event *, bool *);
 
      void (*mbdown)(SDL_Event *, bool *);
};
 
Signal::Signal(){
 
   ((MGDK_App *) MGDK_Setup::app )->RegisterEvent(this);
 
}
 
void Signal::HandleEvents(SDL_Event *evnt, bool *quit){
 
   switch ( evnt->type ){
     
      case SDL_MOUSEBUTTONDOWN: this->mbdown(evnt, quit);
 
   }
 
}
 
 
// ----
 
Signal sig;
Slot slot;
 
sig.mbdown = slot.mbdown;


So stelle ich mir das vor. In Wirklichkeit geht das allerdings nicht, da ich keine Funktionspointer auf Memberfunktionen beliebiger Klassen machen kann.

Solange ich nur die Slot-Klasse behandeln wollte, würde das natürlich kein Problem darstellen, ich müsste ja einfach nur einen Memberpointer für Slot machen. Allerdings, wie gesagt, sollte das dynamisch funktionieren. Hat jemand eine Idee wie das geht?

lg.

PS: MGDK_EventObject ist die Basisklasse für Eventorientierte Klassen.
// Ist seltsamerweise im C++/CLI mit .NET gelandet, wäre nett wenn das jemand in die C++ Rubrik verschieben könnte.


Zuletzt bearbeitet von immapoint am 19:01:41 28.03.2012, insgesamt 3-mal bearbeitet
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 1367
Beitrag Mechanics Mitglied 20:30:05 28.03.2012   Titel:              Zitieren

Keine Lust, das durchzulesen, aber es gibt z.B. boost::signals. Oder wenn du es low level magst, boost::function
immapoint
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.03.2012
Beiträge: 2
Beitrag immapoint Mitglied 17:50:30 29.03.2012   Titel:              Zitieren

Hi,

danke für den Tipp, ich wollte allerdings kein boost nutzen, konnte aus einem unerfindlichen Grund boost noch nie gut leiden ;D

Allerdings haben mich die boost::signal Beispiele auf die Idee gebracht, das ganze mit dem ()-Operator zu machen. Ich bin mir nicht sicher, wie ich das bei mehreren Event-Typen regeln soll, da fällt mir aber sicher noch was ein.

Gruß
immapoint

~Edit: Habs nun mit Templates hinbekommen, das Signal nimmt einmal ein Objekt vom Typ T und einen Memberpointer vom Typ T:: an. Hätte ich früher drauf kommen können ;D


Zuletzt bearbeitet von immapoint am 06:22:06 31.03.2012, insgesamt 1-mal bearbeitet
c++.de :: C++/CLI mit .NET ::  Funktionspointer zu Memberfunktion beliebiger Klasse   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.