Zwei Funktionen aus einer Klasse, Zugriff auf Objekt funktioniert aber nur mit einer?



  • Hi,

    hab das schon im "Andere GUIs"-Sub Forum gepostet, aber nachdem mein Problem dort nicht ganz gelöst wurde und sich herausgestellt hat, dass es wohl kein wxWidgets sondern einfach ein C++-Unverständnis-Problem meinerseits ist, erlaub ich mir mein Problem hier noch einmal zu schildern:

    Ich habe eine wxPlotCtrl und mehrere Klassen. Das ganze sieht zusammengefasst in etwa so aus:

    Die eine Klasse ist:

    class ePanel:public MainPanel 
    { 
    public: 
    void drawObj(); 
    
    private: 
    void Onload(); 
    }
    

    die andere ist:

    class MainPanel:public wxPanel 
    { 
    protected: 
     wxPlotCtrl* m_plotCtrl1; 
    }
    

    In der Funktion void OnLoad::ePanel(), rufe ich eine weitere Funktion (sol)) auf (die kein Member einer Klasse ist), in dieser Funktion wiederum rufe ich dann eine Funktion auf die das PlotCtrl benutzen soll:

    void sol() 
    { 
     ePanel plot; 
    void drawObj(); 
     plot.drawObj(); 
    }
    

    Und dann noch drawObj:

    void ePanel::drawObj() 
    { 
    wxPlotCtrl* m_plotCtrl1 = new wxPlotCtrl(); 
    
     wxGenericPen p(wxGenericColour(255,0,0),2); 
    
    k.CreateLineMarker(wxRect2DDouble(5,2,10,15),p);  
    
     wxPlotMarker k; 
    
     m_plotCtrl1->AddMarker(k); 
    }
    

    Das Problem ist das jetzt rein gar nichts passiert, d.h. der Zugriff auf das wxPlotCtrl Objekt aus der MainPanel Klasse funktioniert offenbar nicht. Wenn ich die drawObj Funktion aber einfach nicht nutze und den Code stattdessen einfach in die OnLoad() Funktion schreibe, funktioniert alles wunderbar - sogar wenn ich

    wxPlotCtrl* m_plotCtrl1 = new wxPlotCtrl();
    

    auslasse.

    Wäre super wenn jemand vielleicht einen Hinweis hätte wo mein Fehler sein könnte!

    Danke im voraus!



  • Hier übrigens noch der Link zu meinem Original-Thread mit dem Problem:

    http://www.c-plusplus.net/forum/318004


  • Mod

    Du hast da eine lokale Variable in deiner Memberfunktion definiert.



  • SeppJ schrieb:

    Du hast da eine lokale Variable in deiner Memberfunktion definiert.

    Sepp bezieht sich in dem Fall vermutlich auf

    wxPlotCtrl* m_plotCtrl1 = new wxPlotCtrl();
    

    Die definierst hier eine lokale Variable, die die Membervariable überschreibt.
    Daher passiert mit der Membervariable rein gar nichts...

    Macht dir aber nichts draus, das passiert jedem mal 😃



  • Hi,

    danke! Das macht Sinn, aber wieso ist das dann kein Problem wenn ich von OnLoad aus auf das Objekt zugreife? Und wo/wie kann ich die Variable denn definieren und dann auf die Membervariable zugreifen? 😡



  • Hallo Leute,

    weiß es ist nicht gerade die feine Art Threads künstlich noch einmal an die Spitze der Seite zu katapultieren, aber kann mir vielleicht dennoch wer einen Hinweis geben wie ich diesen Fehler vermeiden kann bzw. in dem Fall auf die Membervariable zugreifen?

    Ich steh da absolut auf der Leitung und weder mein C++ Buch noch Google konnten mir bis jetzt helfen:-(

    Nochmal danke für jede Hilfe!



  • Tipp: Link auf ideone.com posten, da sehen wir gleich den Code + den vollständigen Compilerfehler. Falls du keinen Compilerfehler bekommst, mach eine Ausgabe und schreib daneben welche andere Ausgabe du erwartet hättest.


  • Mod

    cooky451 schrieb:

    Tipp: Link auf ideone.com posten, da sehen wir gleich den Code + den vollständigen Compilerfehler. Falls du keinen Compilerfehler bekommst, mach eine Ausgabe und schreib daneben welche andere Ausgabe du erwartet hättest.

    Der Fehler ist ja schon gelöst. Er weiß bloß nicht, wie das mit Membervariablen, lokalen Variablen und Gültigkeitsbereichen geht. Sprich: Jemand soll einen Lehraufsatz zum Thema schreiben.

    Empfohlene Alternative: Gutes (! es gibt leider viele schlechte) Buch. Siehe zweiter und vierter Link in meiner Signatur.



  • Hi,

    also ich wollte überhaupt nicht, dass hier irgendwer einen Lehraufsatz schreiben muss....ich steh ganz einfach vor einem (glaube ich) relativ spezifischen Problem, und weder durch Recherche im inet noch durch mein schlaues C++ Buch (keine Sorge, ist keines von den schlechten) hab ich die Antwort auf das Problem gefunden - in den Beispielen die ich sonst gemacht habe, ist es einfach keine Problem eine Instanz einer Klasse zu erzeugen und dann auf die Membervariablen zuzugreifen, nur hab ich auch kein Beispiel zu genau der Struktur gefunden die mir hier Probleme macht.

    Hier versteh ich ganz einfach nicht, warum ich nachdem ich in sol() ja eine Instanz der Klasse erzeuge (was auch problemlos funktioniert), ich dann in der Funktion drawObj() nicht auf die Membervariablen zugreifen kann bzw. wie es funktioniert die betroffene Variable hier NICHT durch eine lokale Variable zu überschreiben wenn ich hier doch nur über "new" darauf zugreifen kann.

    Ich wäre jedenfalls immer noch über jede Hilfe sehr dankbar!



  • Hallo,

    ich schreibe mal auf, was ich aus deinem Text rausgelesen habe:

    class ePanel : public MainPanel
    {
    public:
      void drawObj();
    
    private:
      void Onload();
    }
    
    void ePanel::OnLoad()
    {
      sol();
    }
    
    void sol()
    {
     ePanel plot;
     //void drawObj(); // <- überflüssig (du würdest dadurch eine freie Funktion deklarieren)
     plot.drawObj();
    }
    

    In der Funktion sol() erzeugst du ein neues Objekt 'plot', welches natürlich einen anderen Inhalt hat, als das this-Objekt im OnLoad, d.h. die Membervariable 'm_plotCtrl1' ist dann noch unitialisiert (bzw. exakter: default-created).

    Warum mußt du überhaupt hier eine freie Funktion verwenden?



  • Hi,

    danke für deine Antwort! Eine freie Funktion wollte ich hier eigentlich nur verwenden, weils zur "Logik" des restlichen Programms passen würde - von der OnLoad Funktion ausgehend, werden jeden Menge Funktionen aufgerufen die diverse Operationen durchführen und Werte zurückgeben, die ich aber alle nicht Member der Klasse sind. Die Funktion sol() ist eigentlich nur eine von diesen Funktionen, nur mit dem Unterschied, dass sie eben auch drawObj() aufrufen soll was eben auf m_plotCtrl1 zugreifen muss.

    Aber wenn es die einfachste Lösung ist, werde ich sol() wohl einfach zum member der ePanel Klasse machen.... dann dürfte es ja eigentlich keine Probleme geben, und ich müsste m_plotCtrl1 direkt ansprechen können, oder?

    Trotzdem würd mich sehr interessieren ob es eine Möglichkeit geben würde, auf das Objekt im OnLoad zuzugreifen?



  • Du könntest auch einfach ePanel an sol übergeben.



  • Hi,

    ePanel übergeben funktioniert leider nicht weil da in übergeordneten Klassen private member sind, die ich nicht mitübergeben kann und besser auch nicht anpassen will.

    Hab mich jetzt für die andere Variante entschieden und sol() einfach zur Memberfunktion gemacht, und das ganze funktioniert jetzt auch endlich.

    Rein aus Interesse würd ich aber trotzdem noch gerne wissen, ob es prinzipiell eine Möglichkeit gibt auf das this Objekt aus OnLoad zuzugreifen, so wie ich ursprünglich versucht habe?? In meinem Buch finde ich nämlich absolut gar nichts dazu:-(

    Danke für jede Hilfe!


Anmelden zum Antworten