Korrekter Zugriff auf Membervariablen einer anderen Klasse?



  • Hallo,

    ich habe eine SDI Anwendung gemacht (Doc/View), in der ich per Menüklick ein Dialogfeld öffne.
    Für das Dialogfeld habe ich die Klasse CDialog erstellt. In CDialog::OnOK() will ich 2 eingegebene Werte addieren und in eine Variable schreiben, welche sich aber in der Klasse CDialogtestDoc befindet.

    Wie macht man sowas richtig? Mir ist die Idee gekommen, CDialog als Friend von CDialogtestDoc zu deklarieren, aber das hat irgendwie nicht so geklappt.

    Wie macht man so nen Zugriff "sauber"?

    Vielen Dank schonmal 😉



  • Also, du kannst dir einfach einen Zeiger auf dein Doc holen und dem den Wert geben. Dazu muss es nichtmal eine fried-Klasse sein.
    Lies mal: http://www.c-plusplus.net/forum/viewtopic-var-t-is-125623.html 🙂

    Wenn du den Dialog vom Doc aus öffnest, kannst du das Ergebnis in einer Membervariable des Dialoges speichern und das Doc dann abfragen lassen.
    So etwa:

    CDeinDialog dlg;
    dlg.DoModal();
    m_zahl = dlg.m_dieSumme;
    


  • estartu schrieb:

    Also, du kannst dir einfach einen Zeiger auf dein Doc holen und dem den Wert geben.

    Hmm, so einfach hat das irgendwie nicht geklappt 😉
    Ich hab jetzt mal ohne das Zeug zu verstehen das da in meine OnOK() kopiert:

    CDialogtestDoc* pDoc = (CDialogtestDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
    	ASSERT(pDoc);
    

    das ist dann wohl der einfache Pointer 😉
    Damit geht dann pDoc->m_Var1=m_E1+m_E2 problemlos.

    estartu schrieb:

    CDeinDialog dlg;
    dlg.DoModal();
    m_zahl = dlg.m_dieSumme;
    

    Das funktioniert auch, aber dann krieg ich immer die Werte, auch wenn der Dialog mit Abbrechen beendet wird. Werte sollen aber nur bei klick auf Ok übernommen werden. Von daher passts mit der Lösung oben. Nur selber auf sowas zu kommen ist ein Ding der Unmöglichkeit 🙄



  • Du musst das IDOK deines Dialoges abfangen.

    INT_PTR  DlgResult;
    
    	CMeinDialog dlgMeinDialog;
    	DlgResult = dlgMeinDialog.DoModal();
    
    	if (DlgResult == IDOK)
    	{
    	    // Dein Code für die Werte
        }
    


  • Stimmt, danke! Das wäre wohl die einfachere Möglichkeit 😉



  • saibot83 schrieb:

    Nur selber auf sowas zu kommen ist ein Ding der Unmöglichkeit 🙄

    Deswegen hab ich das ja mal aufgeschrieben. 🙂

    Das

    ASSERT(pDoc);
    

    in deinem Code hat übrigens keine Funktion, weil du nie einen NULL-Zeiger bekommen wirst.
    Du arbeitest mit C-Casts (die einfachen Klammern) und da kommt immer irgendwas raus... und wenns der größte Murks ist.
    Das ASSERT ist nur nützlich im Zusammenhand mit dynamic_cast. In deinem Code schadet es zwar nicht, aber es hilft auch nicht. 😉



  • Ok danke, dann kann ich das noch raus machen 🙂 Ich hatte zuerst den dynamic_cast drin, aber dann kam ne dämliche Warnung, dann hab ichs mit dem normalen Cast gemacht, da kommt keine.



  • saibot83 schrieb:

    aber dann kam ne dämliche Warnung

    Welche? War eventuell die RTTI deaktiviert?



  • "warning C4541: 'dynamic_cast' fuer polymorphen Typ 'class CDocument' mit /GR- verwendet; unvorhersehbares Verhalten moeglich"

    PS: bin noch in Visual Studio 6.0 leider 😞



  • Die Warnung ist nicht dämlich, die heißt nur, dass CStoll Recht hat. 😉
    Schalte mal RTTI in den Projekteigenschaften ein und dann kannst du auch so arbeiten, wie in dem Artikel.

    Wenn der Cast klappt, hast du einen Zeiger.
    Wenn er nicht klappt, hast du NULL.
    🙂



  • Super, jetzt tut's 🙂

    Vielen Dank euch allen!


Anmelden zum Antworten