Wie komme ich an eine Variable aus der Hauptklasse?



  • In meiner HauptKlasse "CMYDLG" stehen alle GUI spezifischen Dinge drin. Nun sind aber einige untergeordnete Dialoge (als Teil eines TabCtrls) in externen Klassen. Dort brauche ich nun unbedingt Zugriff auf meinen Array "enabledBitmaps[]", den ich in cmydlg.h im public-Teil stehen habe.

    void myDialog1::OnCheck1() 
    {
    	CmyDlg test = new CmyDlg;
    	if (m_buttonCheck1.GetCheck() == 1)
    		test.enabledBitmaps[0]=1;
    	else
    		test.enabledBitmaps[0]=0;
    }
    

    Das klappt so nicht, weil enabledBitmaps[] plötzlich eine protected-Variable sein soll... aber sie steht doch im public-Teil des Headers!
    Wie spreche ich diesen Array aus der externen GUI-Klasse an? Kann auch sein, dass das totaler Unfug da oben ist, ich lerne ja noch OOP 😉

    EDIT: Vielleicht sollte ich auch mal Get- und Set-Methoden probieren 😃



  • Merkwürdig... ich habe die Set-Methode nun auf die protected Variable enabledBitmaps fertig, sie wird auch durchlaufen und setzt die korrekten Werte. Aber sobald diese Funktion verlassen wird, bekommt die Variable wieder den vorigen Wert zugewiesen. Er ignoriert die Änderung einfach. Was mache ich falsch? Muss die Variable eine spezielle Deklaration haben?



  • Informier dich mal über den Unterschied zwischen Klasse und Instanz.

    Was du in einen Schrank reinlegst, kannst du nicht aus einem anderen rausholen.



  • MFK schrieb:

    Was du in einen Schrank reinlegst, kannst du nicht aus einem anderen rausholen.

    Hey, der Vergleich ist super. 👍



  • *vordiestirnhau*

    Oh, stimmt, ich habe das "new" so schnell geschrieben, dass ich ganz vergessen habe, dass ich eine Instanz erstellt habe... ok, also muss ich anders an die Variable, das finde ich sicher auch noch raus 😉



  • Ich komme nicht drauf, es klappt immernoch nicht, auch ohne "new". Wahrscheinlich ist es nur ein sehr dummer Fehler meinerseits... hier mal etwas mehr Code:

    Aus dem Hauptprogramm:

    BOOL CToolboxApp::InitInstance()
    {
    	AfxEnableControlContainer();
    
    #ifdef _AFXDLL
    	Enable3dControls();
    #else
    	Enable3dControlsStatic();
    #endif
    
    	CToolboxDlg dlg;
    	m_pMainWnd = &dlg;
    	int nResponse = dlg.DoModal();
    	if (nResponse == IDOK) // exit program via the close button
    	{
    		// do nothing
    	}
    
    	return FALSE;
    }
    

    Aus dem GUI-Header:

    public:
    void CToolboxDlg::setEnabledBitmaps(int pos, int value);
    ...
    protected:
    int enabledBitmaps[BITMAPCOUNT];
    ...
    

    Aus der GUI-cpp

    void CToolboxDlg::setEnabledBitmaps(int pos, int value)
    {
    	enabledBitmaps[pos]=value;
    }
    

    Aus der externen Klasse:

    void myDialog1::OnCheck1() 
    {
    	CToolboxDlg test;
    	if (m_buttonCheck1.GetCheck() == 1)
    		test.setEnabledBitmaps(0,1);
    	else
    		test.setEnabledBitmaps(0,0);
    }
    

    Ich wünschte ich wüsste was ich falsch mache...



  • Es ist egal, ob du new benutzt oder eine Autovariable: Du erstellst ein neues CToolboxDlg-Objekt, das mit dem bereits exisiterenden nichts zu tun hat. Du musst einen Zeiger oder eine Referenz auf das existierende Objekt (das du in CToolboxApp::InitInstance erstellt hast) in diese Methode hineinbringen, z.B. als Membervariable von myDialog1.



  • Ja dieses m_pMainWnd, das auf dlg zeigt ist mir aufgefallen, aber es verwirrt mich, dass es nirgends deklariert ist. Welchen Typ hat es? Die Membervariable von myDialog1 müsste dann denselben Typ haben oder?



  • Langsam nervt dieser Fehler, ich komme nicht drauf... ich muss kurz vor dem Ziel sein, aber nun bekomme ich keine Compiler-Fehler mehr sondern Linker-Fehler.

    Ich habe in myDialog1.h (ganz oben sonst findet InitInstance es nicht) m_pDialog1 als Pointer des Typs CToolboxDlg definiert. In InitInstance habe ich m_pDialog1=&dlg ... sollte doch klappen oder? Die Linker-Fehler sagen aber nun "m_pDialog1 already defined on myDialog1.obj". Was hat das nun wieder zu bedeuten... langsam läuft mir die Zeit davon 😞

    EDIT: Der Linkerfehler kommt, weil ich myDialog.h zweimal included habe: einmal im Hauptprogramm (sonst findet er m_pDialog1 nicht) und in der GUI-Klasse (sonst findet TabCtrl nichts).



  • guck mal in deinem (CROSS POSTER!!!) Thread bei www.cplusplus-forum.de -.- Müsste gehen was ich gepostet hab 😉



  • Juhuuuuuuuuuu! Endlich klappt es! DANKE!

    Cross-Poster stehen unter Zeitdruck und hoffen, dass irgendwer schnellstmöglich eine Lösung findet 😉


Anmelden zum Antworten