Ich arbeite an einem Spiel und arbeite gerade an dem Teil, der Eingaben verarbeitet. Drei Klassen sind hier beteiligt, es gibt die ProjectInstance
Klasse, die den Level startet und so, es gibt einen GameController
, der den Eingang behandelt, und einen PlayerEntity
, der von den Steuerelementen beeinflusst wird, wie durch die GameController
bestimmt. Nach dem Start der Ebene erstellt die ProjectInstance die GameController
, und sie ruft ihre Methode EvaluateControls
in der Step-Methode auf, die innerhalb der Spielschleife aufgerufen wird. Die EvaluateControls
Methode sieht ein bisschen wie folgt aus:Zeiger auf mysteriöse Weise auf Null zurücksetzen
void CGameController::EvaluateControls(CInputBindings *pib) {
// if no player yet
if (gc_ppePlayer == NULL) {
// create it
Handle<CPlayerEntityProperties> hep = memNew(CPlayerEntityProperties);
gc_ppePlayer = (CPlayerEntity *)hep->SpawnEntity();
memDelete((CPlayerEntityProperties *)hep);
ASSERT(gc_ppePlayer != NULL);
return;
}
// handles controls here
}
Diese Funktion wird aufgerufen, korrekt und die Assertion nie auslöst. Bei jedem Aufruf dieser Funktion wird gc_ppePlayer
jedoch auf NULL gesetzt. Wie Sie sehen können, ist keine lokale Variable außerhalb des Gültigkeitsbereichs. Die einzige Stelle gc_ppePlayer
kann auf NULL gesetzt werden, ist im Konstruktor oder möglicherweise im Destruktor, von denen keiner zwischen den Aufrufen an EvaluateControls
aufgerufen wird. Beim Debuggen erhält gc_ppePlayer
vor der Rückgabe einen korrekten und erwarteten Wert. Wenn ich F10 noch einmal drücke und der Cursor auf der schließenden Klammer steht, ändert sich der Wert zu 0xffffffff. Ich bin hier ratlos, wie kann das passieren? Jemand?
+1 für den ersten Teil, was ich gerade sagen wollte, aber ein Singleton ist genauso schlecht wie globale Daten (anti- Muster in meinem Buch) eine einfache Instanziierung und Referenz/Zeiger ist modularer. –
@Robert - Ich denke Singletons können Anti-Muster sein, wenn sie missbraucht werden, was oft der Fall ist. Wenn ein Objekt wirklich ein EINZIGES Objekt im System ist und es niemals legal mehr als 1 von ihnen geben kann, ist das Singleton-Muster nicht das am besten geeignete? Besser als ein roher Zeiger/Referenz .. – LeopardSkinPillBoxHat
..IMHO, denn zumindest können Sie Zugriffe darauf verfolgen. – LeopardSkinPillBoxHat