Wie implementiert man am besten ein Eventsystem?
-
Nicht-statische Memberfunktionen sind ein Fall für sich, aber statische sollten sich eigentlich in jeder Hinsicht genauso verhalten wie globale Funktionen.
Welche Fehlermeldungen bekommst du denn? Kannst du evtl. ein paar Zeilen Code zeigen?
-
Ich hab zwar eigentlich keine Ahnung von Qt, aber soweit ich weiss bietet es dafür das Signal-Slot-Prinzip an. Siehe: http://doc.trolltech.com/4.4/signalsandslots.html
Gruß vom Grünen
-
soweit ich mich erinnern kann war dass ein fehler mit einer nicht gefundenen referenz auf klasse::foo(void*).
sobald ich aber die funktion global mache klappts auf einmal. das problem versteh ich überhaupt nicht.@Baracke_out
dass Qt ein signal slot prinzip besitzt ist mir auch bewusst. ich habe schon meine gründe dass ich ein eigenes system bastle. zudem ist es nie verkehrt rudimentär zu verstehen wie das prinzip funktioniert, obwohl das hier im moment nix damit zu tun hat.
-
dgrat schrieb:
soweit ich mich erinnern kann war dass ein fehler mit einer nicht gefundenen referenz auf klasse::foo(void*).
sobald ich aber die funktion global mache klappts auf einmal. das problem versteh ich überhaupt nicht.Ich hoffe dir ist der unterschied zwischen Funktionszeigern und nicht-statischen Methodenzeigern bekannt.
dgrat schrieb:
ich habe schon meine gründe dass ich ein eigenes system bastle. zudem ist es nie verkehrt rudimentär zu verstehen wie das prinzip funktioniert, obwohl das hier im moment nix damit zu tun hat.
Da ich bei mir boost::signals nicht zum Laufen bekomme, verwende ich auch etwas eigenes, umgehe aber das Problem der Funktionszeiger und Bindung indem ich intern mit boost::function/std::tr1::function und boost::bind/std::tr1::bind arbeite. Ich muss das Rad ja nicht immer neu erfinden (In meiner letzten Firma habe ich das ganze bis auf die unterste Ebene programmieren dürfen, mangels Standardkonformität, mit dem jetzigen Compiler kann ich wenigstens auf die Standardbibliothek und die wesentlichen boost-Bibliotheken zurückgreifen).
cu André
-
ich verwende ja eine eine static member, bzw. habe eine verwendet. isrt es evtl trotzdem irgendwie möglich ne art konvertierung von nicht static member in normale funktion zu realisieren?
-
dgrat schrieb:
ich verwende ja eine eine static member, bzw. habe eine verwendet. isrt es evtl trotzdem irgendwie möglich ne art konvertierung von nicht static member in normale funktion zu realisieren?
Darf ich mal sehen was du da überhaupt zu konvertieren versuchst?
void foo(); class A { public: static void foo(); };Sowohl &foo, als auch &A::foo, liefern beide einen Zeiger des Typs "void (void)".
-
ok ich poste mal alles:
meine abstracte klasse: (die ist übrigens abstract, weil ich noch ein paar andere funktionen habe^^)void (*fktPt)(void*); void *objPt; public: void regUpdateFunction(void (*fkt)(void*), void* obj) { fktPt = fkt; objPt = obj; }nun definiere ich in der erbenden klasse eine static member:
static void updateFEditEvent(void *objpt);implementiere die dann irgendwo:
static void updateFEditEvent(void *objpt) { CFrameEdit *pt = (CFrameEdit*)objpt; if(pt->getCurEvent() == NOTHING || pt->getCurEvent() == SET_POSITION) return; if(pt->getModel() != NULL) { pt->clearTable(); pt->setFrames(pt->getModel()->getNumberOfFrames() ); pt->setScenes(pt->getModel()->getSceneIndices() ); pt->setLookAts(pt->getModel()->getLookAtIndices() ); } }und versuche ohne erfolg die funktion zu registrieren.
/* * registriere Funktion für Eventsystem */ regUpdateFunction(updateFEditEvent, this);undefined reference to `CFrameEdit::updateFEditEvent(void*)'das kuriose ist, dass dieser fehler im prinzip der gleiche ist, wie wenn ich non static member registriere, wobei dass noch erklärbar wäre.
-
dgrat schrieb:
implementiere die dann irgendwo:
static void updateFEditEvent(void *objpt) { ...An der Stelle gehört kein
statichin. Das brauchst (darfst) du nur bei der Deklaration innerhalb der Klassendefinition.
-
der fehler bleibt auch ohne dieses static. aber zumindest die warnung verschwindet....
-
dgrat schrieb:
der fehler bleibt auch ohne dieses static. aber zumindest die warnung verschwindet....
Ah, da hab ich nicht genau genug hingeguckt, das war nämlich nicht der einzige Fehler in der Zeile

So sollte es gehen:
void CFrameEdit::updateFEditEvent(void *objpt) { ... }