Duda urgente con destructores
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.
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.
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
Es lo que se me ocurre
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.
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.
