2009-06-12 15 views
11

¿Cómo sobrecargo un destructor?Cómo sobrecargar un destructor?

+2

Como no puedes, ¿tenías alguna idea de cómo usar un destructor sobrecargado o solo sentías curiosidad? Si quieres hacer algo más que crear dos destructores para una clase, críalo y podremos discutir cómo lograrlo. –

+0

Me pregunto si fue posible, ¿cómo esperas que se comporte? –

+0

Fue una pregunta planteada por otra persona. Querían ver qué tan rápido respondería SO. – Joshua

Respuesta

31

No puede. Solo hay un destructor por clase en C++.

Lo que puedes hacer es crear un destructor privado y luego tener varios métodos públicos que llaman al destructor de formas nuevas e interesantes.

class Foo { 
    ~Foo() { ... } 
public: 
    DestroyFoo(int) { ... }; 
    DestroyFoo(std::string) { ... } 
}; 
+0

¿Eso no mataría RAII? – Qberticus

+0

@Qberticus, sí lo haría de alguna manera. Todavía no hay nada que impida que el OP cree una clase adicional que tiene RAII simple y destruye a Foo de una manera interesante.Sin más información del OP, no puedo decirlo. Espero que OP lo haya considerado y lo tenga en cuenta en su solución. – JaredPar

+2

Um eso es privado * destructor * ... –

1

¡No puede! Cada clase solo puede tener un destructor. ¿Cómo puedes tener más de uno? El destructor se dispara automáticamente; no hay forma de que el lenguaje sepa a cuál llamar.

Los destructores virtuales, sin embargo, son otra cuestión.

0

No es así. No puedes tener 2 destructores en una clase.

¿Qué estás tratando de lograr?

1

Sobrecarga significa tener varias funciones con el mismo nombre que toman diferentes argumentos. Como swap(int &a, int &b) y swap(double &a, double &b). Un destructor no toma argumentos. Sobrecargarlo no tendría sentido.

Si tiene que hacer cosas diferentes al destruir un objeto dependiendo de ciertas circunstancias, entonces solo necesita los enunciados if correspondientes en su destructor para verificar esas circunstancias.

3

Interesante pregunta pero la única razón por la que querría sobrecargar un destructor sería porque desea liberar algún recurso en un destructor y dejarlo en otro, ¿no?

Básicamente, puede lograr dicho comportamiento desde su propio destructor utilizando un valor booleano adicional que le dirá si un recurso específico debe liberarse o no. Este booleano se establecerá en tu constructor y/o uno de tus otros métodos y en tu destructor verificas si está configurado. Si no está configurado, entonces liberarías el recurso. De lo contrario, simplemente deja el recurso y probablemente alguna otra tarea lo liberará. (Esto tendría sentido cuando compartas recursos entre varios objetos).

La razón por la que no puedes sobrecargar un destructor es porque tu código no tiene ni idea de a qué destructor necesita llamar cuando destruyes un objeto . ¡A menos que llames mal a los destructores, pero luego te estás comportando mal! ;-)

0

No sobrecargue el destructor porque nunca lo llama. Esa es su esencia básica. (De lo que pasamos en clase.)