Zugriff auf Memberfunktionen außerhalb des Hauptdialoges



  • Hallo alle,

    ich bin C++ Laie und habe folgendes Anliegen:

    Ich habe mit MFC ein kleines Dialogprogramm erstellt und würde gerne mein Main-Programm in einem seperaten cpp. File haben. Dieses Main Programm wird innerhalb der Dialogklasse"CXXXDlg" von einem Timer gestartet.
    Meine Frage:

    Wie kann ich jetzt aus meinem Main-Programm auf memberVariablen/memberFunktionen meines CXXXDlg-Dialoges zugreiffen. Führt der Weg über einen Pointer auf den Dialog-Wenn ja wie lege ich diesen an???

    Wenn ich momentan in meinem Main auf eine Puplic-Funktion des Dialoges zugreifen will (weiß auch net ob ich das richtig mach mit CXXXDlg::PublicFunction()) mekert der Compiler folgendermaßen: 'CXXXDlgDlg::callTest' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion'

    Ich würde mein Programm wirklich gerne so strukturieren da für mich das die Übersichtlichste Methode zum arbeiten ist. Über Antworten würde ich mich sehr freuen!!!!



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-125623.html
    Ziemlich weit unten ist der Abschnitt zu Dialoganwendungen.



  • Du musst Die Instanze des Dialoges Deiner "main Programm" (was auch immer das sein mag" mitgeben...

    void TueWas(CMyDialog &dlg)
    {
      // Mach was...
    }
    

    Aufgerufen wird es dann wie folgt:

    OnTimer()
    {
      TueWas(*this);
    }
    

    Falls Du ein Thread verwenden solltest, so musst Du beachten, dass Du die Zugriffe auf die Dialog-Instance via CriticalSection absichern musst!



  • Atm mach ich das über nen globalen Zeiger auf meinen Dialog/Formview/usw:

    //Programmname "FooBar"
    #includes ...
    ...
    CFooBarDlg* pFooBarDlg=NULL;
    
    CFooBarDlg::CFooBarDlg():CDialog(etc)
    {
       pFooBarDlg=(CFooBarDlg*) this;
    }
    

    Diese Methode (globale Zeiger)scheint allerdings recht unpopulär 🙄



  • Taelan schrieb:

    Atm mach ich das über nen globalen Zeiger auf meinen Dialog/Formview/usw
    [...]
    Diese Methode (globale Zeiger)scheint allerdings recht unpopulär 🙄

    Ja. Genau deswegen macht man das normal nicht mit einer globalen Variable sondern mit einem Parameter für die Funktion oder einem Member-Variable, falls Du eine Klasse verwendest...



  • Vielen Dank!!

    es funktioniert endlich so wie ich`s mir vorstelle !!!

    Ich hab aber noch ne kleine Anfängerfrage wenn Ihr schon so aufmerksam seid!

    Ich dachte immer einen Header schreibe ich so:

    #if !defined MyFunctions_h
    #define MyFunctions_h

    #endif

    Wie ich aber feststelle meckert der Compiler weil er trotzdem Sachen mehrmals einbindet. Was mache ich falsch?



  • Wenn Du das "#endif" gaaaaanz am Ende hast, sollte es eigentlich gehen... wenn es natürlich auch oben steht bringt es ja nix...

    Ich empfehle aber sowieso heutzutage "#pragma once" zu verwenden...



  • Vor allem solltest du zwischen dem #ifndef und #endif nur Deklarationen haben, Definitionen gehören in die zugehörige CPP-Datei (der Guard schützt nämlich nur davor, daß der Header bei einem Übersetzungslauf mehrfach eingebunden wird - mehrfach vorkommende Symbole stammen normalerweise aus unabhängig voneinander compilierten Bibliotheksdateien).



  • hmm ich würd das ganze #ifdefn _CKLASSE_H_ #define _CKLASSE_H_ usw einfach weg lassen und nen einfaches #pragma once am anfang des .h files packen und feddig...


Anmelden zum Antworten