Methode einer anderen Klasse aufrufen



  • Hallo,

    Ich habe folgendes Problem: Ich will von meiner Klasse CProject1View aus (abgel. von CView) die Methoden einer anderen Klasse (heisst CWaveNumb) aufrufen. Dies soll über ein Objekt geschehen. Dabei erhalte ich immer die folgende Fehlermeldung:

    Debug Assertion Failed, in Zeile 43 von objcore.cpp

    Was hab ich da falsch gemacht?
    Übrigens: Project1View.h ist in CWaveNumb.cpp includiert.

    Danke für jede Antwort!



  • Code! Wir brauchen Code!
    (aber bitte nicht gleich alles)

    a) wie erfolgt der Aufruf, wo kommen die beteiligten Instanzen her, und wie sieh der Code um das Assert drumrum aus?



  • Der Aufruf erfolgt in CProject1View.cpp:

    void CIR_Project1View::OnLButtonDblClk(UINT nFlags, CPoint point) 
    {
    
    ClassA TempObj;
    TempObj.GetWaveNumber(point);
    
    CScrollView::OnLButtonDblClk(nFlags, point);
    }
    

    Debugger verweist auf " ASSERT(this != NULL); " in objcore.cpp

    BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
    {
    	ASSERT(this != NULL);
    	// it better be in valid memory, at least for CObject size
    	ASSERT(AfxIsValidAddress(this, sizeof(CObject)));
    
    	// simple SI case
    	CRuntimeClass* pClassThis = GetRuntimeClass();
    	return pClassThis->IsDerivedFrom(pClass);
    }
    


  • Sieht aus als wäre TempObj nicht richtig initialisiert. Da ich ClassA nicht kenne, ist es schwer was dazu zu sagen.

    Irgendwo in GetWaveNumber() wird IsKindOf() für irgendein Objkt mit einem NULL-Zeiger aufgerufen.

    IsKindOf wird in der MFC-spezifischen Run Time Type Information genutzt, um herauszufinden,. ob ein objekt von einem bestimmten Typ ist.

    Das beste wäre, du hängst dich mit dem Debugger an die Assertion, und arbeitest dich den Call Stack rauf.



  • Das Problem ist, dass ich direkt beim Aufruf die Fehlermeldung erhalte. Der Code der Funktion funct einwandfrei.
    Will heissen Der Debugger meckert, wenn ich beim Aufruf angelangt bin, also hier:

    TempObj.GetWaveNumber(point);

    Danach geht nix mehr. Das meintest Du doch oder ?



  • Nu muss ich nochmal nerven. 🙄

    Mein grosses Problem ist im Moment eigendlich, dass die Ansichtsklasse meiner Anwendung zu viele Funktionen hat. Ich finde mich nicht mehr zurecht.
    Also wollte ich einige Funktionen in andere Klassen packen, um die Aufgabenverteilung besser organisieren zu können (Ihr wisst schon: Auto-Basisklasse, abgeleitete Klasse Gaspedal, Bremspedal, Airbag...)

    Alle Funktionen in der Ansichtsklasse zu implementieren, kann doch wohl nicht die gute Kunst des Programmierens sein oder ?

    Hilfe, Hilfe! 😞



  • LabRat schrieb:

    (Ihr wisst schon: Auto-Basisklasse, abgeleitete Klasse Gaspedal, Bremspedal, Airbag...)

    ein auto is kein gaspedal sondern beinhaltet ein instanz der klasse gaspedal 😉



  • Stimmt! Klappt jetzt übrigens. Der Compiler mochte die Übergabe als Referenz nicht. Mit dem Prototyp:

    int GetWaveNumber(CPoint& point);
    

    gab es ein Problem, mit

    int GetWaveNumber(CPoint point);
    

    nicht mehr. Kann mir das nochmal jemand erklären (bitte) ?

    An dieser Stelle, danke für die Mühe und nen schönen Abend noch! 😃



  • hieß der fehler

    C2345 Error in line 27. ich mag die übergabe als referenz nicht ?

    fehler + aufrufcode please (auch in zukunft)



  • Ne, ich dachte gestern noch ich hätte den Fehler gefunden. Zu früh gefreut! Der eigendliche Fehler lag aber im Funktionsrumpf

    void CRange::GetWaveNumber(CPoint& point)
    {
    
    CIR_Project3Doc* pDoc = GetDocument();  // das hat den Fehler ausgelöst
    ...
    }
    

    Ich habe jetzt pDoc einfach als Parameter übergeben

    void CRange::GetWaveNumber(CIR_Project3Doc* pDoc, CPoint& point)
    {
    ...
    }
    

    und es funktioniert jetzt (wirklich).


Anmelden zum Antworten