Probleme beim Aufruf einer Memberfunktion einer anderen Klasse



  • Ich möchte die im code fett makierte funktion aufrufen:
    Ausschnitt aus UserManage.cpp:
    [cpp]
    void CUserManage::OnBnClickedBnDel()
    {
    int nIndex, nResult;
    nResult = MessageBox("Möchten sie den ausgewählten Benutzer wirklich löschen?", "Benutzer löschen", MB_YESNO | MB_ICONEXCLAMATION);
    if(nResult == IDYES)
    {
    CUserAdd UserAdd;
    UserAdd.DBDelUser();
    }
    }
    [/cpp]

    Wie oben schon gesagt erhalte ich an der unten fett makierten stelle eine zugriffsverletzung.
    Funktion aus der Datei UserAdd.cpp:

    [cpp]
    bool CUserAdd::DBDelUser()
    {
    CDaoDatabase db;
    CDaoRecordset rs(&db);
    CString lpszFile = "C:\\metex.mdb";
    COleVariant olevar;
    int nGetCount;

    db.Open(lpszFile);
    rs.Open(AFX_DAO_USE_DEFAULT_TYPE, "SELECT * FROM Userlist", 0);
    nGetCount = m_ctlListUser->GetCurSel();
    rs.Move(nGetCount);
    rs.Delete();
    DBRefreshList();
    return true;
    }
    [/cpp]

    Hoffe ihr versteht meine Problemstellung... 😃

    Danke schonmal für euer Mitdenken!

    Chris



  • 🙄

    Der eine macht einen Thread mit dem Titel "Probleme beim Aufruf einer Memberfunktion einer anderen Klasse", der andere einen mit "Variablenzugriff zwischen Klassen".

    Also mach folgendes:

    void CUserManage::OnBnClickedBnDel()
    {
        CUserAdd*    pUA;
        int          nIndex, nResult;
    
        nResult = MessageBox("Möchten sie den ausgewählten Benutzer wirklich löschen?", "Benutzer löschen", MB_YESNO | MB_ICONEXCLAMATION);
        if(nResult == IDYES) pUA->DBDelUser(); //Eigentlich wäre es am besten wenn du den zu löschenden User im Funktionheader mitgibst, aber ist ja egal
    }
    

    In der anderen dann genau das selbe mit dem Pointer. Wie jedoch im Comment geschrieben wärs eigentlich am besten wenn du es so machst dass man die Funktion beispielsweise mit DBDelUser("Irgendwer") aufrufen kann...



  • Riecht danach die Beiträge zu nem FAQ zusammen zu fassen... 😉

    Also irgenwie klappt das ganze auch nicht... ich erhalte nun zusätzlich zu dem einen oben erwähnten fehler den folgenden, der während der runtime in einer messagebox beim drücken des buttons kommt:

    the variable 'pUserAdd' is being used without being defined.

    Ich versteh mal wieder meinen fehler nicht... *schäm*

    m_ctlListUser ist bereits ein pointer falls du daas meinst...(ja ich weis m_pCtlListUser)

    Aber die Idee mit der userübergabe beim funktionsaufruf werde ich einbauen... hört sich besser an als die meinige Lösung. 🙂



  • is klar.

    Du erstellst eine Variable

    CUserAdd*    pUserAdd;
    

    als pointer der in den "Wald" zeigt. Danach willst du über diesen pointer auf eine memberfunktion zugreifen, das kann nicht gehen.

    Entweder musst du mit

    pUserAdd = new CUserAdd;
    

    Speicher allokieren, dann hast du aber wieder genau das gleiche Problem wie vorher, oder du weißt dem Pointer eine schon bestehende Klasse zu.

    pUserAdd = &ExistingClass
    


  • Oh stimmt... peinlich. Soweit so klar, allerdings versteh ich leider deine 2. Lösung nicht. (bitte nochmal eine erklärung für einen Anfänger...)

    Danke für euer Verständnis!



  • kann man das auch irgendwie ohne eine globale Zeigervariable lösen? Ich will nämlich auch eine Funktion von einer übergeordneten (schon existierenden) Dialogfeldklasse aufrufen. Und zwar aus einem untergeordnetem (verflixten 😃 ) PropertyPage.


Anmelden zum Antworten