Vaiablen fremder Klassen setzten



  • Hallo,

    ich will ein Häkchen in eine andere Klasse setzten. Das sieht so aus:

    CSeite1 *pSeite1;
    CString jiggy;
    if (jiggy == "Check all")
    {
        pSeite1->m_bHistory = TRUE;
    }
    else
    {
        //unwichtig
    }
    

    So, dass ist der Code. Wenn ich das jetzt ausführe, stürzt das ganze Ding ab. Hab bis jetzt noch nicht viel mit Zeigern gmacht, also bitte nicht lachen.



  • Du solltest etwas mehr Code zeigen.
    Der Zeiger in diesem Code ist NULL und dann stürzt dein Programm ab.

    CSeitel *pSeitel
    alleine erstellt noch keinen Gültigen Zeiger auf die andere Klasse.



  • Hi,

    muss man nicht schreiben:

    CSeite1 *pSeite1 = new CSeite1;
    

    😕 in meinem C++-Buch haben die Leute grad vor Zeigern aufgehört und mich auf andere Bücher verwiesen 😉 Also nicht hauen!

    Happosai



  • Muss man. Aber nur wenn man nicht bereits eine Instanz dieser Klasse hat.



  • Ok, hier ist die ganze Funktion:

    void CInetSecureDlg::OnCheckall() 
    {
    CSeite1 *pSeite1 = 0;
    CString jiggy;
    GetDlgItem(IDC_CHECKALL)->GetWindowText(jiggy);
    if (jiggy == "Check all")
    {
        GetDlgItem(IDC_CHECKALL)->SetWindowText("Uncheck all");
        pSeite1->m_bHistory = TRUE;
        pSeite1->m_bDropList = TRUE;
        pSeite1->m_bTemp = TRUE;
        pSeite1->m_bCookies = TRUE;
        pSeite1->m_bAutoComplete = TRUE;
        pSeite1->m_bFavorites = TRUE;
        pSeite1->UpdateData(FALSE);
    
    }
    else
    {
        GetDlgItem(IDC_CHECKALL)->SetWindowText("Check all");
    }   
    }
    

    CSeite1 ist übrigens eine Registerkarte und die Funktion wird auf dem "Hauptdialog" ausgeführt. Vielleicht is es ja wichtig.



  • Und wo ist jetzt der "GÜLTIGE" Zeiger auf deine andere Klasse.
    Du erstellt einen Zeiger der auf "nichts" zeigt.



  • Und wie soll ich das machen?

    CSeite1 *pSeite1 = CSeite1;
    

    So?



  • Besteht bereits eine Instanz der Klasse und du willst nur etwas an den Variablen ändern dann hast du schon einen Zeiger auf die Klasse.

    Willst du einen neue Instanz

    Dann

    CSeite1 *pSeite1 = new CSeite1();
    
    pseite1->m_bHistory = TRUE;
    
    delete pSeite1;
    

    oder

    CSeite1 pSeite1;
    pSeite1.m_bHistory = TRUE;
    

    [ Dieser Beitrag wurde am 04.01.2003 um 13:28 Uhr von Unix-Tom editiert. ]



  • Ok, danke für die Antwort. Ich hab das jetzt mit deinem zweiten Vorschlag ausprobiert. Das Programm ist zwar nicht abgeschmiert, aber ich seh auch keine Häkchen. Also hab ich das ausprobiert:

    pSeite1.UpdateData(FALSE);
    

    Mit dem Ergebnis, dass mein Programm wieder abstürzt. Die von Microsoft haben da nen Assert gesetzt mit folgendem Code:

    ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
    

    Sehr schön. Und jetzt? Ich hab mir schon überlegt, das Ding auszukommentieren, aber die werden schon ihre Gründe habe, wieso sie den Assert setzen. Aber wie soll ich das jetzt machen? DoModal aufzurufen ist doch auch Schwachsinn...



  • Was heißt es wird nicht angezeigt ?
    Wo soll es nicht angezeigt werden ?
    Wenn du einen Dialog meinst dann hat dieser eine eigene Klasse und da braucht man keine andere Klasse. Oder wie oder was jetzt.



  • Ja, hab mich ein bisschen unverständlich ausgedrückt. Ich meine den Code von UpdateData:

    BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
    {
        ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
          ...
    

    Und man kann halt keine Häkchen sehen. Normalerweise muss man die doch mit UpdateData(FALSE) zum Vorschein bringen.



  • Das Fenster muss zum Zeitpunkt von UpdateData aber auch bestehen...

    in meinem C++-Buch haben die Leute grad vor Zeigern aufgehört und mich auf andere Bücher verwiesen Also nicht hauen!

    Dann war da aber kein C++-Buch sondern allenfalls ein C++-Groschenroman

    Mit den Zeigern ist relativ simpel. Sie "zeigen" nur auf ein Objekt im Speicher, sind also im Endeffekt nichts anderes als eine "Zahl" (32-Bit hat ein Pointer in der Regel. Bald werden es aber 64 Bit sein, da 32 nur für einen Arbeitsspeicher bis 4GB ausreichen) in der die Speicheradresse steht. Den Zeiger auf die Instanz einer Klasse holst du dir so...
    [cpp]
    // Instanz wird erzeugt
    CLustischlustischfallerallera instanz;
    ...

    // Pointer wird geholt
    CLustischlustischfallerallera***** pointer = **&**instanz;[/cpp]

    Das ist alles

    [ Dieser Beitrag wurde am 05.01.2003 um 15:18 Uhr von MaSTaH editiert. ]


Log in to reply