2013-03-31 4 views
6

를 통해 소유권을 대표하는이 세 가지 클래스가 있습니다.C++ 포인터 내 게임 엔진에서

enter image description here

EntityVehicle의 인스턴스 EntityCharacter에 대한 포인터와 좌석 개체를 포함합니다. 좌석 객체의 목표 문자 엔티티 포인터가 널 포인터 인 경우, 그 좌석 객체 위에는 문자가 없습니다. EntityCharacter-class 인스턴스에는 좌석 개체에 대한 포인터가있어이 문자 엔티티가 일부 차량에 있는지 여부를 나타냅니다. 우리 둘 다 성격과 차량 엔티티를 통해이 소유권을 확인할 수 있습니다

EntityCharacter -> EntityVehicleSeat 
EntityCharacter <- EntityVehicleSeat 

이 방법 : 즉

는 EntityCharacter 클래스 인스턴스 EntityVehicleSeat에 대한 포인터와 주변의 다른 방법이있다.

포인터를 서로 가리 키도록 설정하는 것이 간단하지만 한 가지 문제가 있습니다. 다른 개체가 범위를 벗어나면 나머지 개체에 잘못된 포인터가 있습니다.

enter image description here

한 사람이 어떻게 이런 종류의 정교 소유권을 나타낼 수 있습니까? 다른 객체가 더 이상 존재하지 않는다는 사실을 다른 객체가 어떻게 알 수 있습니까?

+0

소멸자에 대한 알림을 사용합니다. – Yousf

+0

다른 객체를 알리기 위해 소멸자를 사용할 수 있습니까? –

+0

이것은 단지 1 : 1 관계입니까? – Potatoswatter

답변

4

양방향 객체를 포함하여 객체 - 객체 관계를 관리하면 소멸자가 도움이됩니다. 이 같은 허상 포인터의 문제를 제거 할 수 있습니다 :이 방법

~EntityCharacter() { 
    // Do some other cleanup... 
    ... 
    if (seatPtr) { 
     assert(seatPtr->characterPtr == this); // That's my seat! 
     seatPtr->characterPtr = NULL; 
    } 
} 

~ EntityVehicleSeat() { 
    // Do some other cleanup... 
    ... 
    if (characterPtr) { 
     assert(characterPtr->seatPtr == this); // That's my character! 
     characterPtr->seatPtr = NULL; 
    } 
} 

하나의 문제는 동시성 : 좌석과 문자가 다른 스레드에서 동시에 삭제 될 수 있다면, 당신은 삭제를 동기화해야합니다.

+0

너무 쉽고 편리합니다. 고마워요! – Helixirr

관련 문제