[C con Clase] Ahora el destructor

Programante programante en gmail.com
Mar Jun 19 22:34:49 CEST 2007


rodolfo rosso paz escribió:
> en la funcion main(), tengo las siguientes lineas:
>
> 	// verifica el operador sobrecargado +
> 	// c1 = mortisaranga,  c2 = matachilanga
> 	cout << "c1 + c2 arroja = " << c1 + c2 << "\n";
>
>
> Resultado de la corrida:
>
> Constructor de Conversion: 0x77fda0 - mortisaranga matachilanga
> c1 + c2 arroja = mortisaranga matachilanga
> Destructor: 0x77fda0 - mortisaranga matachilanga
>
> Hasta aqui todo perfecto, el destructor hace lo esperado destruyendo la 
> cadena
> temporal, pero...
>
> Cuando reemplazo en el main() las lineas antes mencionadas por estas otras:
>
> 	// verifica el operador sobrecargado +
> 	// c1 = mortisaranga,  c2 = matachilanga
> 	Cadena c33 = c1 + c2;
> 	cout << "c33 arroja = " << c33 << "\n";
>
> La corrida resulta:
>
> Constructor de Conversion: 0x77fda0 - mortisaranga matachilanga
> c33 arroja = mortisaranga matachilanga
>   
El ámbito de la nueva cadena en el primer caso es la línea del cout.
El destructor se llama inmediatamente después de imprimir mortisaranga 
matachilanga.

En cambio en el segundo caso el ámbito de c33 es main(). Se llamará al 
destructor justo después del return.
Tras evaluar el valor que retorna pero antes de devolver el control a la 
función previa.
Posiblemente esté imprimiéndola inmediatamente antes de cerrar el 
programa. Por lo cual no lo ves.


Por ejemplo, si tienes

Cadena c33 = c1 + c2;
cout << "c33 arroja = " << c33 << "\n";
system("pause");

Se mostrará el texto del destructor *después* del system pause, por lo que no te dará tiempo 
a verlo antes de que se cierre la ventana (podría verse si abres el programa en una consola 
ya creada).

Para arreglar esto tienes dos opciones:
-Crear c33 y poner su cout en otra función, que llames desde main(). El destructor se llamará
al volver de ella, antes de system("pause")
-Establecer un nuevo ámbito alrededor de c33. Esto es:

{

  Cadena c33 = c1 + c2;
  cout << "c33 arroja = " << c33 << "\n";
}
system("pause");

c33 se destruirá al salir de las llaves, logrando con ello ver el 
destructor antes de la pausa.

Espero que te haya sido útil.




Más información sobre la lista de distribución Cconclase