Duda urgente con destructores

djxere
13 de Diciembre del 2005
Hola, pongo duda urgente porque tengo un examen pasado mañana y en exámenes antiguos he visto una cuestión que no encuentro ni en los apuntes ni en internet, quizás la enfoco mal. A ver si me pueden ayudar. Gracias.

Cuestión:
-Suponga que deseo llamar al destructor de un objeto local, o al menos se desean sus efectos. Por ejemplo, tenemos un objeto local de una clase que maneja ficheros; uno de los efectos del destructor es cerrar el fichero correspondiente, y queremos cerrarlo antes del fin de la función:

void f()
{
Fichero f("un fichero"); // se abre f
// codigo cuando 'f' está abierto
// AQUI CERRAMOS 'f'
// codigo cuando 'f' está cerrado
}

Hay (al menos) dos soluciones: una modificando la clase fichero y otra modificando la función f(). Explique las dos.

// mi solución:

La solución modificando la función f() es utilizar los operadores new y delete, ya que así evito que el compilador llame al final de la función automaticamente a los destructores y los elimino cuando yo quiera.

¿Pero cuál sería la solución desde dentro de la clase?
Puedo definir yo el destructor, pero al llamarlo en la función éste se llama tanto en la función al llamarlo yo explicitamente como al salir del ámbito de la función. Está claro que si es un fichero, al llamar al destructor se cierra el fichero, pero ahí no he cambiado nada de la clase.

kike
13 de Diciembre del 2005
En el ejemplo expuesto, si solo se trata de cerrar el archivo de disco, puedes hacer una funcion especifica que cierre el archivo y la llamas en lugar de destruir el objeto.
Es lo que se me ocurre

djxere
13 de Diciembre del 2005
Gracias, la solución según me ha comentado un compañero es esa. Creo una función dentro de la clase que se llame CerrarFichero().

En realidad ésto es válido porque se trata con ficheros, aunque si el tipo fuera otro no se podría ya que una variable automática no sale de la pila mientras esté en su ámbito. En el caso del fichero, aunque la variable del tipo siga existiendo no se puede acceder al fichero ya cerrado.

Gracias.