Im Buch steht, dass "pRenderer" nicht in CSprite freigegeben werden darf. Wenn ich bisher alles richtig verstanden habe, ist der Grund der, dass "g_pFramework->GetRenderer()" im Prinzip einen Zeiger auf das erzeugte Objekt zurückgibt. "m_pRenderer" bekommt also einfach eine Adresse eines anderen Zeigers von Framework, der auf die Speicheradresse des Objekts zeigt. Das heißt, wenn man "m_pRenderer" im Destruktor von CSprite freigibt, den zurückgegebenen Zeiger von "g_pFramework->GetRenderer()" aber woanders weiter verwendet, ist dieser undefiniert. VErstehe ich das richtig?
An sich ja. Du versuchst das ganze aber viel zu technisch zu betrachten. Das Framework erstellt einen Renderer. Eine Sprite muss den Renderer kennen um sich selbst rendern zu können. Das Framework erstellt jetzt den Renderer und speichert sich diesen intern irgendwie ab. Es bietet mit
GetRenderer die Möglichkeit von extern auf diesen Renderer zuzugreifen. Dafür liefert die Funktion die Adresse zu eben diesem zurück. Würde die Funktion einfach ein Renderer Objekt zurück liefern so würde dies an dieser Stelle kopiert und du möchtest nicht viele Renderer haben sondern einfach einen welcher von deinen Sprites verwendet wird. Deshalb merkt sich die Sprite einfach die Adresse zu der jeweiligen Instanz. Würde eine Sprite im eigenen Destruktor den Renderer zerstören so führt das schnell zu Problemen. Stell dir vor du hast ein Projektil welches zerstört wird. Dabei wird möglicherweise die Sprite des Projektils mit zerstört. Würde dadurch der Renderer zerstört so könnte nichts anderes vom Spiel gerendert werden. Das ist nichts was du willst. Um das ganze logisch auszudrücken, das Framework besitzt den Renderer und eine Sprite kennt den/einen Renderer.
"if (m_pImage == NULL)" ist auch etwas unsauber. Wenn ich das richtig verstehe, zeigt der Zeiger "m_pImage", der in der Klasse deklariert wurde, auf irgend eine Adresse, nur nicht auf NULL; da nicht mit NULL initialisiert. Daher funktioniert das. Wenn ich dem Zeiger aber aus versehen im Konstruktor NULL zuweise, komme ich garnicht dazu mein Bild zu laden, weil die Bedingung immer zutrifft.
Der Code sieht nicht korrekt aus. In Zeile 11 möchtest du vermutlich
m_pImage = ... und nicht
pTemp = ... stehen haben.