Funktionspointer an unabhängige Klasse uebergeben



  • Hi,
    nachdem ich nun lange erfolglos gesucht und getestet habe ohne eine Lösung zu finden, versuche ich es hier.

    Ich habe 2 unabhängige Klassen und möchte von der einen aus einen Funktionszeiger an die andere Klasse uebergeben, damit diese den Code ausführen kann.
    Also Klasse1 hat intern einen Funktionenzeiger definiert :
    void (Klasse1::*FunctionPointer) ();
    Dieser soll mit einem internen Timer zyklich aufgerufen werden um z.B. Daten auszugeben.

    In Klasse 2 sind verschiedene Funktionen drin z.B. Data1 und Data2 ...
    Nun will ich die Pointer dieser Funktionen an Klasse1 uebergeben z.B.

    Klasse1 *obj1 = new Klasse1(this);
    obj1->FunctionPointer = (&Klasse2::Data1)

    Klasse1 *obj2 = new Klasse1(this);
    obj2->FunctionPointer = (&Klasse2::Data2)

    ...

    Es kommt aber die Fehlermeldung dass Klasse1 nicht in Klasse2 konvertiert werden kann. Konvertierung erfordert reinterpret_cast ...
    reinterpret_cast habe ich aber nicht zum Laufen bekommen :-((

    Die Klassen sollen unabhängig voneinander bleiben.

    Geht das mit reinterpret_cast, und wenn ja wie ist die Syntax ?

    Gruss
    Joe



  • Callbacks löst man besser über das Observer Pattern, dann bleiben die Klassen auch wirklich unabhängig und es ist erweiterbar. Oder man nimmt eine Bibliothek, die sowas kapselt, z.b. boost::signal oder Qt.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi,

    ich würde trotzdem gerne wissen, ob es so gehen könnte, wie ich es mir vorstelle ? Wenn ja wie muss der reinterpret_cast aussehen ? Evtl. Beispiel.

    Nach Observer und boost-signal werde ich googeln, oder hat jemand ein gutes Beispiel ?

    Was soll der Hinweis Qt ? Das Projekt ist unter Qt geschrieben, aber der Hinweis ist so zu allgemein. Mit Signals und Slots will ich es nicht lösen, da ich auf Performance angewiesen bin.

    Gruss
    Joe



  • Dein Funktionszeiger zeigt aber auf eine Memberfunktion der Klasse Klasse1, wieso willst du ihn dann an eine der Klasse Klasse2 binden?!?
    Das was du da vor hast, kapselt boost::signals wunderbar weg. (btw. besser gleich boost::signals2 nehmen) Und was machen diese Funktionen bzw. auch dein Programm, so dass du von vornherein ohne Test (!) weißt, dass Qt Signal/Slot die Performance beeinträchtigt?



  • Hi,

    Klasse 1 ist eine Klasse, die CAN-Botschaften mit eigenem Timing auf einer Hardware ausgibt, d.h. immer wenn der Timer ausläuft muessen neue Daten generiert und gesendet werden. Das aktive Timing liegt also in jedem Objekt der Klasse 1.
    Es sollen bis zu 20 Objekte dieses Types gleichzeitg laufen und jedes muss andere Daten senden ...

    Klasse 2 kennt die Hardware nicht und definiert nur die CAN-Botschaften und deren Inhalte.

    Ich möchte auch nicht fuer jede Can-Botschaft eine neue Klasse erstellen.
    Die Aufrufe in Klasse 2 sollen alle generisch und gleich sein z.B.

    Msg1->setTiming(1);
    Msg1->setID(0x111);
    Msg1->setCallBack(&Functionpopinter1);

    Msg2->setTiming(10);
    Msg2->setID(0x222);
    Msg2->setCallBack(&Functionpopinter2);

    Msg3->setTiming(50);
    Msg3->setID(0x455);
    Msg3->setCallBack(&Functionpopinter3);

    So brauche ich nur noch für jedes CanMsg-Objekt eine Callback und das wars.

    Geht das nun prinzipiell mit reinterpret_cast oder nicht ???

    Gruss
    Joe



  • cotecmania schrieb:

    Klasse 1 ist eine Klasse, die CAN-Botschaften mit eigenem Timing auf einer Hardware ausgibt, d.h. immer wenn der Timer ausläuft muessen neue Daten generiert und gesendet werden.

    Also passiert einiges in den aufgerufenen Funktionen? Dann sollte der Overhead, den Qt Signal/Slot erzeugt recht vernachlässigbar sein.

    Geht das nun prinzipiell mit reinterpret_cast oder nicht ???

    Nein. Und jetzt mach als erstes einen Test, ob Qt Signal/Slot wirklich zu langsam für deinen Einsatzzweck ist, oder verwende gleich boost::signals2, da hast du kaum Overhead.


Anmelden zum Antworten