2012-03-25 9 views
11

Ho un oggetto che deve distruggere se stesso.Un oggetto può distruggere se stesso?

  • Si può fare?

  • L'esempio è errato?

    void Pawn::specialMoves(Coordinate const& from, Coordinate const& to, int passant) 
    { 
        /*...*/ 
        m_board->replace(to, new Queen(m_colour));//replace pawn by queen 
    } 
    
    void Board::replace(Coordinate const &to, Piece* newPiece) 
    { 
        delete tile[to.x()][to.y()]; 
        tile[to.x()][to.y()] = newPiece; 
    } 
    
+4

Quale oggetto si sta distruggendo qui?FTR, distruggendo se stesso, potrebbe essere "delete this;" o "this-> ~ T();" (con 'T' come tipo). Entrambi sono validi ma richiedono molta attenzione per essere usati correttamente. –

+0

Non vedo nulla che si stia distruggendo nel tuo esempio. –

+1

Il pedone si cancella da solo. Immagino che una volta 'm_board-> sostituisci (to, new Queen (m_colour));' è stato chiamato function void Pawn :: specialMoves (...) 'non può finire' – danjjl

risposta

25

Sì, è legale chiamare delete this dall'interno di una funzione membro. Ma c'è lo molto raramente una buona ragione per farlo (specialmente se si sta scrivendo un C++ idiomatico in cui la maggior parte delle attività di gestione della memoria dovrebbero essere delegate a contenitori, puntatori intelligenti, ecc.).

e avete bisogno di essere molto attenti:

  • l'oggetto di suicidio deve essere stato assegnato dinamicamente tramite new (non new[]).
  • una volta che un oggetto si è suicidato, è un comportamento indefinito fare qualcosa che si basa sulla propria esistenza (non può più accedere alle proprie variabili membro, chiamare le proprie funzioni virtuali, ecc.).
+4

+1 non ha mai considerato 'nuovo []'. – hmjd

+1

Un po 'tardi qui, ma per essere sicuri che un oggetto non fosse allocato tramite 'new []', sarebbe sufficiente scrivere 'operator new []() = delete'? – iFreilicht

+0

Suppongo che chiamare metodi di rimozione 'std' containers 'sia ugualmente valido, amirite? –

2

Sì, dovrebbe funzionare. È consentito anche lo delete this;.

Ma il codice che chiama specialMoves() potrebbe essere una brutta sorpresa.

0

Finché non si accede alle variabili membro o al puntatore this dopo la chiamata per distruggere l'oggetto, si dovrebbe andare bene. Dal momento che non sembra che tu stia facendo una di queste cose, l'esempio dovrebbe funzionare.

1

D: Un oggetto può distruggere se stesso?

A: Sicuro. "Cancella questo" è un idioma popolare in COM/ActiveX

Per quanto riguarda l'algoritmo, io suggerirei:

  • un oggetto "board" ha "mattonelle". Forse solo un semplice array 2-D.

  • Si inizia con n "pezzi"

  • Alcuni controllore (forse un oggetto "gioco"), si muove un "pezzo" rispetto ad una "piastrella".

  • Ogni "tile" ha un riferimento a 0 o 1 "pezzi"

Non sono sicuro che vedo alcun motivo per creare o eliminare qualsiasi cosa su una base per-move.

IMHO ...

+2

Penso che il caso sia quando il pedone raggiunge l'estremità opposta del tabellone, viene rimpiazzato da una regina. –

Problemi correlati