CFont::DeleteObject Implementierung?



  • Hi Leute,

    mich würde mal interessieren wie die Implementierung dieser Methode aussieht.

    In meiner Anwendung habe ich mehrere Klassen die miteinander kommunizieren. Gelegentlich muss eines der Objekte zerstört werden. Allgemein macht man das ja mit "delete object". Die CFont::DeleteObject-Methode hat mich begeistert 🙂 würde gerne auch solche Methoden für meine Objekte implementieren. Wie gehe ich dabei vor? Kann mir nicht vorstellen wie ich innerhalb eines Objektes(Klasse) dieses Objekt löschen kann. Gibt es nicht -ohne jetzt lang im Verzeichnisbaum nach dieser Datei zu suchen- eine Möglichkeit sich den SourceCode der CFont::DeleteObject-Methode anzuschauen? Über rechte Mousetaste kann ich zwar "gehe zu Definition" oder "gehe zu Deklaration" gelangen, aber deren Implmentierung bleibt mir verborgen!?

    Grüße
    ToH



  • Hast du schon mal einen Breakpoint da drauf gesetzt und dann "In Aufruf springen" bzw F11 ausprobiert ?



  • class foo
    {	
    public:
    
    	void KillMe()
    	{
    		deleteObject(this);
    	}
    	static void deleteObject(foo *obj)
    	{	
    		delete obj;
    	}
    };
    
    int main()
    {
    	foo *a = new foo();
    	a->KillMe();
    	return 0;
    }
    

    Ob das gegen irgend einen Standard verstösst und nur auf jedem 2. Compiler geht weis ich aber gerade nicht :p

    enjoy!
    /me



  • @toh: Warum siehst Du nicht einfach nach?
    @das_brot: warum nicht "delete this"?



  • Weil das IIRC definitiv gegen den Standard ist.



  • das_brot schrieb:

    Weil das IIRC definitiv gegen den Standard ist.

    Nein das ist erlaubt.



  • Wie ist das dann mit:

    int main()
    {
        foo a;
        a.KillMe();
    }
    


  • Das verstösst definitiv gegen den Standard. Da fehlt return 0; 🤡
    Im Ernst: Ich weis nicht ob das geht, kann nicht mal jemand nachschauen wie das gemacht ist?


  • Administrator

    CFont ist von CGdiObject abgeleitet und übernimmt DeleteObject.

    HGDIOBJ CGdiObject::Detach()
    {
    	HGDIOBJ hObject = m_hObject;
    	if (hObject != NULL)
    	{
    		CHandleMap* pMap = afxMapHGDIOBJ(); // don't create if not exist
    		if (pMap != NULL)
    			pMap->RemoveHandle(m_hObject);
    	}
    
    	m_hObject = NULL;
    	return hObject;
    }
    
    BOOL CGdiObject::DeleteObject()
    {
    	if (m_hObject == NULL)
    		return FALSE;
    	return ::DeleteObject(Detach());
    }
    

    und dann ::DeleteObject

    WINGDIAPI BOOL WINAPI DeleteObject( IN HGDIOBJ);
    

    Tjo und weiter komm ich nicht. Wie kann man denn die WINAPI anschauen gehen? ^^

    Grüssli



  • falsch! schrieb:

    das_brot schrieb:

    Weil das IIRC definitiv gegen den Standard ist.

    Nein das ist erlaubt.

    Und wird sogar sehr häufig eingesetzt (z.B. bei "Zählenden Objekten" wie COM-(Wrapper)-Objekte...


Anmelden zum Antworten