Eine Funktion der Owner-Klasse aus einem Formular aufrufen...



  • Hallo zusammen,

    ich habe etwas implementiert aber bin nicht ganz zufrieden. Ich frage mich wie man es "richtig" macht....
    Bei meinem Programm kommt es relativ häufig vor, dass ich Funktionen der "Parent"-Klasse aus der "Child"-Klasse aufrufen muss.
    So ungefähr:

    -----------
    |  TDevice  |
    |-----------|     ---------------     
    | update()  |----| TfrmDevice    |
    |___________|    |---------------|
                     |ownerFunktion()|
                     |_______________|
    

    Die Klasse TDevice hat ein dynamisches Fenster: "formular"

    //TDevice.h
    class TDevice 
    {
      protected:
      private:
      TfrmDevice * formular;
      int value;
      public:
      TDevice();
      update();
    }
    //TDevice.cpp
    TDevice::TDevice()
    {
      formular = new TfrmDevice();
    }
    TDevice::update()
    {
      value++;
    }
    

    Im Konstruktor des Formulars wird auch ein Pointer auf dem Owner übergeben.

    //-----------------------------------------------------------------------
    //TfrmDevice.h
    class TfrmDevice : public TForm
    {
      protected:
      private:
      void * devOwner;
      public:
      TfrmDevice(TComponent* Owner, void* pDevOwner);
      ownerFunktion();
    }
    //TfrmDevice.cpp
    TfrmDevice::TfrmDevice(TComponent* Owner, void* pDevOwner)
    {
      devOwner=pDevOwner;
    }
    TfrmDevice::ownerFunktion()
    {
      ((TDevice*)devOwner)->update();
    }
    

    Wenn ich nun die public Funktion "update" aufrufen will, muss der Pointer gecastet
    werden, und dann wird die Funktion aufgerufen.

    Gibt es eine andere, elegantere Lösung dafür??

    Für Eure Hilfe bedanke ich mich schon 🙂

    Juliux



  • Wieso gehst du hier über einen void-Pointer? Warum nicht gleich TDevice?



  • Braunstein schrieb:

    Wieso gehst du hier über einen void-Pointer? Warum nicht gleich TDevice?

    Weil der Compiler eine Fehlermeldung bringt, wenn ich den Header vom Owner(TDevice.h) in TfrmDevice.h einfüge 😞



  • Mach dort im Header nur eine Forwarddeklaration auf TDevice und lagere Code, der diese Klasse verwendet in die TfrmDevice.cpp aus. Dort kannst du dann auch TDevice.h inkludieren.



  • Braunstein schrieb:

    Mach dort im Header nur eine Forwarddeklaration auf TDevice und lagere Code, der diese Klasse verwendet in die TfrmDevice.cpp aus. Dort kannst du dann auch TDevice.h inkludieren.

    Hey!! so klappts. 🙂

    Danke für den Tipp! 👍
    Würdest du es auch so programmieren?

    Falls jemand das gleiche Problem hat, der Code sieht nun so aus:

    //TfrmDevice.h
    class TDevice; //Forwarddeklaration
    class TfrmDevice : public TForm
    {
      protected:
      private:
      TDevice * devOwner;
      public:
      TfrmDevice(TComponent* Owner, TDevice* pDevOwner);
      ownerFunktion();
    }
    //TfrmDevice.cpp
    #include "TDevice.h"
    TfrmDevice::TfrmDevice(TComponent* Owner, TDevice* pDevOwner)
    {
      devOwner=pDevOwner;
    }
    TfrmDevice::ownerFunktion()
    {
      devOwner->update();
    }
    


  • Ich würde den Konstruktor noch etwas ändern. Wenn du von TForm ableitest solltest du den Konstruktor der Basisklasse auch aufrufen da dort ja ein Parameter (Owner) erwartet wird. Außerdem verwende ich lieber Initialisierungslisten.
    Also so

    TfrmDevice::TfrmDevice(TComponent* Owner, TDevice* pDevOwner) : 
              TForm(Owner), devOwner(pDevOwner)
    { }
    


  • BTW, willste nicht noch TDevice::update() und TfrmDevice::ownerFunktion() einen return-Typen verpassen? Wären dann zumindest gültiges C++;



  • witte schrieb:

    BTW, willste nicht noch TDevice::update() und TfrmDevice::ownerFunktion() einen return-Typen verpassen? Wären dann zumindest gültiges C++;

    Da hast du Recht.
    Der Code ist eher Pseudocode. Ich wollte das Problem irgendwie verständlicher darstellen.


Anmelden zum Antworten