2013-03-31 12 views
6

Nel mio motore di gioco, ci sono tre classi: EntityCharacter, EntityVehicle e EntityVehicleSeat.C++ - Rappresentare la proprietà tramite puntatori

enter image description here

EntityVehicle contiene oggetti di sicurezza con puntatori a istanze di EntityCharacter. Se il puntatore dell'entità carattere di destinazione dell'oggetto seat è un puntatore nullo, nessun personaggio è seduto su quello specifico oggetto del sedile. Le istanze di classe EntityCharacter hanno anche dei puntatori per posizionare gli oggetti, indicando se queste entità di carattere sono sedute in alcuni veicoli o meno.

In altre parole, esempio EntityCharacter-classe ha un puntatore al EntityVehicleSeat e viceversa:

EntityCharacter -> EntityVehicleSeat 
EntityCharacter <- EntityVehicleSeat 

In questo modo siamo in grado di controllare questo possesso sia tramite entità carattere e del veicolo.

Sarebbe semplice impostare i puntatori in modo che puntino l'un l'altro, ma c'è un problema: se l'altro oggetto non rientra nell'ambito, finiremo per avere un puntatore non valido nell'oggetto rimanente.

enter image description here

Come si può rappresentare questo tipo di proprietà sofisticato? In che modo l'altro oggetto può essere informato del fatto che l'altro oggetto non esiste più?

+0

Utilizzare la notifica sul distruttore. – Yousf

+0

potresti usare il distruttore per notificare l'altro oggetto? –

+0

Questa è solo una relazione 1: 1? – Potatoswatter

risposta

4

La gestione delle relazioni oggetto-oggetto, comprese quelle bidirezionali, è il momento in cui i distruttori diventano utili. È possibile eliminare il problema di puntatori penzolanti come questo:

~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; 
    } 
} 

Un problema con questo approccio è la concorrenza: se il sedile e un carattere possono essere eliminati contemporaneamente da diversi thread, si avrebbe bisogno di sincronizzare le eliminazioni.

+0

Così facile ma così a portata di mano. Molte grazie! – Helixirr