Zugiff von einer Klasse auf die andere



  • Sorry, bin neu in Forum und muss mich zunächst an Eure Regeln gewöhnen. Trotzdem Danke.
    Hier die Fehlermeldung:
    /home/papel/kdev1/src/kdev2.cpp: In member function ‘virtual void kdev2::closeEvent(QCloseEvent*)’:
    ./edit.h:42: error: object missing in reference to ‘Form1::pushButton5’
    /home/papel/kdev1/src/kdev2.cpp:37: error: from this location

    protectet slots sind ähnlich wie Private Funktionen in QT

    pushButton5 entspricht pushButton1 in meinem Beispiel


  • Mod

    Du benötigst eine gültige Referenz bzw. einen gültigen Pointer auf das Fenster.
    Dies ist dann entweder eine Membervariable von deinem 2. Fenster, oder du Arbeitest mit einem Singleton als Controller,
    der dann wiederum die Referenz auf dein Fenster zurückgibt.



  • Das mit der Referenz ist mir klar nur 😃 wie mache ich das in C++ /QT. 🙂
    Hier noch ein der Teil von Main der das erste Fenster erzeugt.
    Auf was und wie muss ich aus der Funktion Zugreifen um den z.B. den Text von pushButton1 (5) zu ändern. Das Programm ist bereits sehr groß und deshalb habe ich nur ein Beispiel als Code dargestellt. Dadurch auch mal die Angabe pushButton1 und dann pushbutton5. Alles andere geht und die Referenzen stimmen.
    Aber wie komme ich von kdev2::beispielfunktion(); an pushbuttenx von kdev1 ; mainWin. Vielen Dank

    int main(int argc, char **argv)
    { 
    kdev1 *mainWin = 0;
    mainWin = new kdev1();
            app.setMainWidget( mainWin );
            mainWin->show();
    }
    

  • Mod

    Ich setzte jetzt mal voraus das du die Basics von C++ kannst:

    struct A
    {
    std::string foo;
    std::string Getfoo()const{return foo;}
    void Setfoo(std::string& f){foo = f;}
    }
    
    struct B
    {
       A* a;
       B():a(new A()){}
       void tuwas(){a->Setfoo("bar");std::cout << a->Getfoo();}
    }
    

    Du musst also entsprechend dafür sorgen, das deine Klasse einen gültigen Verweis auf die andere Klasse hat.
    D.h. wenn du die Klasse erzeugst, musst du dafür sorgen, das auch andere Klassen die dies wissen sollen, davon Kenntniss nehmen.



  • Danke!

    Programmiere seit 30 Jahren in den verschiedensten Sprachen. C++ mit QT ist jedoch recht neu für mich. In Assembler würde ich dem Linker einfach sagen das pushButtonx "extern" ist. Aber sowas in C wohl kein guter Stil. Werde das mal versuchen in mein Programm einzubauen. Hab da sicher noch ein Grundsätzliches Verständnissproblem.
    Da mein Programm sehr groß ist habe ich ein Beispiel geschrieben das dass Problem beschreibt aber nicht meinem Programm entspricht. Trenne die Klassen sonst schön von einander oder leite sie von einer gemeinsamen Basis ab. Hier will ich jedoch einfach den Text von einem Button in Fenster 1 von einer Funktion der Klasse abgeleitet von Fenster 2 ändern. Möchte eben nicht alles umstellen.

    Vielen Dank für die schnelle Hilfe 🙂 scheint ein gutes Forum zu sein.

    Wenn jemand mein konkr. Beispiel erweitern könnte wäre mir sicher noch schneller geholfen. Vielleicht hänge ich ja in einer Schleife ( in meinem Kopf ).



  • Auf die in main() erzeugte Variable/Instanz - mainWin - von Klasse kdev1
    kann ich aus einer Funktion die zur klasse kdev2 gehört nicht zugreifen.
    Eigentlich klar da diese ja nur local in main existiert.

    kdev1 *mainWin
    

    wo und wie kann ich - mainWin - den in der Klasse kdev2 bekannt machen.
    in der Klssendeklaration von kdev2 ? wie ?

    Vielen Dank


  • Mod

    enki04 schrieb:

    Auf die in main() erzeugte Variable/Instanz - mainWin - von Klasse kdev1
    kann ich aus einer Funktion die zur klasse kdev2 gehört nicht zugreifen.
    Eigentlich klar da diese ja nur local in main existiert.

    kdev1 *mainWin
    

    wo und wie kann ich - mainWin - den in der Klasse kdev2 bekannt machen.
    in der Klssendeklaration von kdev2 ? wie ?

    Vielen Dank

    Bitte keine Doppelpostings 😉

    Also um es noch mal zusammen zufassen, du hast 2 Fenster:
    kdev1 und kdev2. Ich nenn das jetzt mal A und B der Einfachheit halber 😉
    A soll wenn sich etwas ändert, auch in B etwas ändern, z.b. den Text des PushButtons.
    Du zeigst wo A erzeugt wird, jedoch kann man dort noch nix machen, da ja B nicht existiert.
    Also müsste A über einen Pointer vom Typ B verfügen, der am Anfang mit NULL initialisiert wird.
    Dann müsstest du, wenn B erzeugt wird, bzw. dort wo B erzeugt wird, A den Pointer auf die Instanz von B übergeben.
    Im Falle eines Änderungsevents in A müsstest du prüfen ob der Pointer auf B gültig ist, und dann entsprechend
    diese durchführen. Soweit die Theorie 😉

    ➡ Und Assembler ist eine ganz andere Welt als OOP Strukturierte Programmierung, wie es in der GUI Programmierung üblich ist.

    phlox



  • Oder schonmal an static gedacht? 😉



  • was spricht hier gegen signal/slot ?


  • Mod

    hellihjb schrieb:

    was spricht hier gegen signal/slot ?

    Nichts, wäre evtl. sogar die beste Lösung unter QT. Aber es geht halt auch anders in normalen C++.
    Kannst ja mal eine Signal/Slot Version posten...



  • Kannst ja mal eine Signal/Slot Version posten...

    du loest zb im closeEvent von kdev2 ein signal aus, das du (sobald beide objekte existent sind, zb nach der konstruktion von kdev2) per connect mit einem slot von kdev1 verbindest der in geeigneter weise auf das ableben von kdev2 reagiert.
    voraussetzung ist, dass es irgendeine zentrale schnittstelle gibt, der beide objekte bekannt sind und entsprechend die verbindung vornehmen kann.


Anmelden zum Antworten