Te explico lo que entiendo
Veras, esta es la historia de tu variable local cuando devuelves su referencia...
1)Cuando llamas a la funcion, esta reserva espacio para la memoria de la funcion (crea un stack segun recuerdo)
2)Tu variable local obtiene una direccion dentro del stack. Imaginate q esta direccion es 0x45D (El numero hexadecimal 45D, equivalente a 1117)
3)Tu funcion retorna la referencia a esta variable, o sea la posicion de memorioa numero 0x45d o 1117
4)La funcion termina de ejecutarse y se libera la pila. Enfatizo que se LIBERA, o sea que cualquier programa puede usarla a su gusto, pero no se elimina!!!! O sea que hasta que algun otro programa o proceso no se le asigne el byte Numero 45d, tu referencia seguira funcionando bien hasta que el sistema operativo asigne esa area a algun otro proceso y entonces todo comenzara a fallar :/
Sobre el operador =, es algo tambien un poco complejo:
El operador *, toma como argumento una variable de tipo racional y devuelve una variable del tipo Racional, hasta ahi vas bien.
este valor devuelto es bastante especial, porque ya saliste de la funcion, asi que la pila es liberada, pero todavia queda un dato que no podemos perder, el valor devuelto que probablemente asignaremos a otra variable. Es especial porque si te das cuenta es un tipo valor que no es parte de tu main (algo en teoria imposible porque solo los punteros y las referencias deberian poder accederse fuera de la pila; pero de esto se encarga el mismo c++ - probablemente volviendolo internamente una referencia - asi q todavia esta bien)
Entonces, viene el operador =, que toma como argumento ese tipo valor tan especial devuelto por el operador *. Normalmente cuando una funcion pide un valor por referencia, pero tu le pasas uno por valor, el c++ se encarga de referenciarla.
El problema es ahora que al parecer el c++ no tiene la capacidad de encargarse de referenciar este tipo, (que ya internamente es una referencia :/) por lo que ese valor devuelto solo podra ser pasado por valor al operador =, causando un error!!
Para arreglar este problema se me ocurren 2 opciones:
1) Crea otra version del operador =, pero pide los argumentos por valor en caso de que la variable no se pueda pasar por referencia como es tu caso:
Racional operator=(Racional r)//notece sin ningun & involucrado...
{
this->set_racional(r.num,r.den);
return *this;
}
2)Utiliza c# jajajajaj
Bueno si no entiendes algode lo q dije (probable porque soy malo explicando) entonces pregunta lo q no entiendas.
Si quieres averiguar por tu cuenta como funcionan las referencias y las pilas de llamada a funcion, cheka estos links del curso de c++ mas copleto q he visto hasta ahora en la web:
http://www.zator.com/Cpp/E4_2_3.htmhttp://www.zator.com/Cpp/E1_3_2.htmBye