저는 게임을하고 있는데 현재 입력을 처리하는 부분에 대해 작업하고 있습니다. 이 클래스에는 세 가지 클래스가 있으며 레벨을 시작하는 ProjectInstance
클래스가 있습니다. 입력을 처리 할 GameController
과 GameController
으로 결정되는 컨트롤의 영향을받는 PlayerEntity
이 있습니다. 레벨을 시작하면 ProjectInstance가 GameController
을 만들고 게임 루프 내부에서 호출되는 Step 메서드에서 EvaluateControls
메서드를 호출합니다. EvaluateControls
방법은 조금 다음과 같습니다포인터가 신비하게 NULL로 재설정됩니다.
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
}
이 기능을 제대로 호출하고 어설 트리거되지 않습니다. 그러나이 함수가 호출 될 때마다 gc_ppePlayer
은 NULL로 설정됩니다. 보시다시피 범위를 벗어나는 지역 변수가 아닙니다. gc_ppePlayer
이 NULL로 설정 될 수있는 유일한 장소는 생성자 또는 가능하면 소멸자에 있으며 둘 다 EvaluateControls
을 호출하는 사이에 호출되지 않습니다. 디버깅 할 때 gc_ppePlayer
은 반환 전에 정확하고 예상되는 값을받습니다. 한 번 더 F10 키를 누르고 커서가 닫는 중괄호에 있으면 값은 0xffffffff로 바뀝니다. 나는 여기서 잃어 버렸어. 어떻게 이런 일이 일어날 수 있니? 누군가?
첫 번째 부분에 대한 지시 사항을 추가 할 것입니다, 그냥 내가 말하려고했는데,하지만 싱글 톤은 마찬가지로 글로벌 데이터 (안티 - 내 책의 패턴) 간단한 인스턴스화 및 참조/포인터가 더 모듈화되어 있습니다. –
@ 로버트 - 싱글 톤은 오용되었을 때 안티 패턴이 될 수 있다고 생각합니다. 종종 그렇습니다. 객체가 실제로 시스템의 단일 객체이고 합법적으로 그 중 하나 이상일 수없는 경우, 싱글 톤 패턴이 가장 적합한 객체가 아닌가? 원시 포인터/참조보다 나은 ... – LeopardSkinPillBoxHat
.. 적어도 당신은 그것에 대한 액세스를 추적 할 수 있기 때문에. – LeopardSkinPillBoxHat