Klasseninstanz global verfügbar machen



  • Ich möchte folgendes erreichen: Ich habe eine Klasseninstanz angelegt, welche ein Objekt einer anderen Klasse erstellt und dieses zweite Klassenobjekt erstellt wieder ein anderes Objekt. Dieses dritte Objekt benötigt Daten vom ersten Objekt. Ich frage mich nun wie man sowas egtl am Geschicktesten macht. Im Code sieht das irgendwie so aus:

    class ErsteKlasse{
    
    public:
        IrgendeinContainer* foo(){
            return &IrgendeinContainerInstanz;
        }
    
        void bar(){
            ZweiteKlasse *InstanzZweiteKlasse = new ZweiteKlasse();
        }
    
    };
    
    class ZweiteKlasse{
    public:
        ZweiteKlasse(){
            DritteKlasse* blubb = new DritteKlasse();
            blubb->BraucheFunktionVonErsterKlasse();
        }
    
    };
    
    class DritteKlasse{
    public:
        void BraucheFunktionVonErsterKlasse(){
            //Diese Funktion muss auf die Funktion der ErstenKlasse zugreifen
            ZeigeraufIrgendeinContainerVariable = ErsteKlasse::foo();
        }
    
    };
    
    main{
    
        ErsteKlasse* bla = new ErsteKlasse();
        bla->bar();
    
    }
    

    So in der Art soll das funktionieren. Konkret geht es um folgendes: Ich verwende Qt zur Erstellung von GUIs. Ich habe dabei ein Hauptfenster und von dort aus werden weitere Fenster erstellt um Eingaben vom Benutzer abzufragen. Die Klassen oben repräsentieren eben diese Fenster. Ich überlege nun wie man es besten regelt, dass im 3. Fenster (DritteKlasse) Funktionen vom Hauptfenster (ErsteKlasse) verwendet werden können.

    Bisher hab ich das immer so gehandhabt, dass ich immer einen Zeiger auf das übergeordnete Fenster übergeben habe oder eben einen Zeiger auf das Hauptfenster, das scheint mir doch sehr umständlich und irgendwie diletantisch 😉

    Bisher habe ich mir überlegt einfach eine statische Variable anzulegen in der Form:

    class ErsteKlasse{
    
    public:
        static ErsteKlasse* Hauptfenster
    
        ErsteKlasse(){
            Hauptfenster = this;
        }
    
         IrgendeinContainer* foo(){
            return &IrgendeinContainerInstanz;
        }
    
        void bar(){
            ZweiteKlasse *InstanzZweiteKlasse = new ZweiteKlasse();
        }
    
    };
    

    Es gibt ja garantiert nur ein Hauptfenster, so würd man ja schonmal auf die entsprechenden Methoden von überall zugreifen können. Gibts da noch simplere oder bessere Möglichkeiten?

    Schöne Grüße!



  • Übergib im Constructor Referenzen oder pointer auf die Oberklasse.

    class Erstes;
    
    class Zweites
    {
    public:
        Zweites(Erstes* er) : erstes(er){ }
    
    private:
        Erstes* erstes;
    };
    
    class Erstes
    {
    public:
        void foo()
        {
            Zweites* zw = new Zweites(this);
            // ...
        }
    };
    


  • Marthog schrieb:

    Übergib im Constructor Referenzen oder pointer auf die Oberklasse.

    class Erstes;
    
    class Zweites
    {
    public:
        Zweites(Erstes* er) : erstes(er){ }
    
    private:
        Erstes* erstes;
    };
    
    class Erstes
    {
    public:
        void foo()
        {
            Zweites* zw = new Zweites(this);
            // ...
        }
    };
    

    Wie gesagt so hab ich das bisher immer gemacht, ich will aber vermeiden den Pointer durch alle Klassen durchzuschleppen. Da muss es doch bestimmt einer bessere Möglichkeit geben 😉



  • Freddy_Kay schrieb:

    Da muss es doch bestimmt einer bessere Möglichkeit geben 😉

    Mir wäre keine bekannt. Global machen ist auf jeden Fall keine bessere Möglichkeit...



  • Static Methoden?



  • Namenloser324 schrieb:

    Static Methoden?

    ja daran hatte ich auch gedacht. Hab das prinzip allerdings nicht vollends verstanden. Würde eine static Methode in der Lage sein eine nicht statische Variable aus der Klasseninstanz zurückzugeben ohne die eigentliche Instanz zu kennen?



  • Freddy_Kay schrieb:

    Würde eine static Methode in der Lage sein eine nicht statische Variable aus der Klasseninstanz zurückzugeben ohne die eigentliche Instanz zu kennen?

    Sicher 😉


Log in to reply