2012-03-25 16 views
11

Tengo un objeto que necesita destruirse a sí mismo.¿Puede un objeto destruirse a sí mismo?

  • ¿Se puede hacer?

  • ¿Es incorrecto el ejemplo?

    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

¿Qué objeto se está destruyendo aquí?FTR, destruyéndose a sí mismo sería 'delete this;' o 'this-> ~ T();' (siendo 'T' su tipo). Ambos son válidos pero requieren mucho cuidado para ser utilizados correctamente. –

+0

No veo nada destruyéndose en su ejemplo. –

+1

Peón se borra a sí mismo. Me imagino que una vez 'm_board-> replace (to, new Queen (m_colour));' ha sido llamada function void Pawn :: specialMoves (...) 'no puede terminar' – danjjl

Respuesta

25

Sí, es legal para llamar delete this desde el interior de una función miembro. Pero hay muy raramente una buena razón para hacerlo (especialmente si está escribiendo C++ idiomático donde la mayoría de las tareas de administración de memoria deberían delegarse en contenedores, punteros inteligentes, etc.).

y hay que ser muy cuidado:

  • el objeto de suicidio deben haber sido asignado dinámicamente a través new (no new[]).
  • una vez que un objeto se ha suicidado, es un comportamiento indefinido para hacer cualquier cosa que dependa de su propia existencia (ya no puede acceder a sus propias variables miembro, llamar a sus propias funciones virtuales, etc.).
+4

+1 nunca había considerado 'new []'. – hmjd

+1

Un poco tarde aquí, pero para asegurarse de que un objeto no se asignó a través de 'new []', ¿sería suficiente escribir 'operator new []() = delete'? – iFreilicht

+0

Supongo que llamar a los métodos de eliminación de 'contenedores estándar' es igualmente correcto, amirite? –

2

Sí, debería funcionar. Incluso delete this; está permitido.

Pero el código que llama al specialMoves() podría ser una sorpresa desagradable.

0

Siempre y cuando no acceda a las variables de miembro o al puntero this después de la llamada para destruir el objeto, debería estar bien. Como no parece que estés haciendo una de estas cosas, el ejemplo debería funcionar.

1

P: ¿Puede un objeto destruirse a sí mismo?

A: Sure. "Suprimir esta" es un modismo popular en COM/ActiveX

En cuanto a su algoritmo, me gustaría sugerir:

  • una "junta" objeto tiene "baldosas". Tal vez solo una simple matriz 2-D.

  • Usted comienza con n "piezas"

  • Algunos controlador (tal vez un objeto "juego"), mueve un "pedazo" con respecto a un "mosaico".

  • Cada "baldosas" tiene una referencia a 0 ó 1 "piezas"

No estoy seguro de que veo ningún motivo para crear o eliminar cualquier cosa en función de cada movimiento.

mi humilde opinión ...

+2

Creo que el caso es que cuando el peón llega al extremo opuesto del tablero, es reemplazado por una reina. –

Cuestiones relacionadas