Si, muchas gracias por una respuesta tan completa.<br><br>Investigare los templates, creo que son parecidos a los tipos genericos de ADA no?<br><br><div class="gmail_quote">2009/3/9 Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hola Vicente,<div><div></div><div class="h5"><br>
<br>
vicente lozano wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola!<br>
<br>
Estaba pensando, mientras leia un ejemplo de una clase fracciones,<br>
que quizas exista alguna forma de declarar algo como esto:<br>
<br>
friend Fraccion operator+ ( Fraccion &fr, int & in)<br>
friend Fraccion operator+ ( Fraccion &fr, float & fl)<br>
friend Fraccion operator+ ( Fraccion &fr, double & do)<br>
<br>
friend Fraccion operator+ ( void &anything, Fraccion &f)<br>
{<br>
 return (f+anything);<br>
}<br>
<br>
Es posible? Es seguro?<br>
<br>
</blockquote>
<br></div></div>
Tal y como está, no se puede por el tipo 'void &', aunque sí podrías usar un puntero a 'void'. De todas maneras, lo que quieres hacer se puede lograr a través de otro mecanismo propio de C++ llamado "plantillas" o "templates" en inglés. En tu caso, esto sería,<br>

<br>
template< typename T ><br>
Fraccion operator+( const T &sumando, const Fraccion &fraccion )<br>
{<br>
  ...<br>
}<br>
<br>
Esta función-plantilla serviría como una función general del operador +. a. Podemos implementar versiones concretas aun teniendo esta plantilla. Por ejemplo,<br>
<br>
template<><br>
Fraccion operator+( const int &sumando, const Fraccion &fraccion )<br>
{<br>
  ...<br>
}<br>
<br>
Obviamente, las plantillas no van a solucionarte todos los problemas, por ejemplo, podemos tener lo siguiente:<br>
<br>
Punto pt(4,3);<br>
Fraccion f(1,2);<br>
<br>
f = pt + f;<br>
<br>
El compilador generará la sobrecarga del operador + correspondiente al tipo 'Punto', pero aún así, esto no resuelve el problema de sumar un punto a una fracción.<br>
<br>
<br>
De todas maneras, los ejemplos que has escrito no requieren varias versiones, ya que C++ tiene reglas semánticas establecidas para cambiar de tipo para los tipos fundamentales. Por ello, sugiero crear una sola versión para el tipo de dato más "elevado" que es 'long double'. Esto es,<br>

<br>
Fraccion operator+( const Fraccion &fr, long double sumando );<br>
<br>
Si usamos cualquier otro tipo fundamental, éste será convertido implícitamente (promocionado) a 'long double'. Por ejemplo,<br>
<br>
Fraccion f(1,2);<br>
short int nNum=5;<br>
<br>
f = f + nNum;<br>
<br>
El valor en 'nNum' es convertido y pasado a 'long double'. Con esto, no necesitamos crear múltiples versiones.<br>
<br>
Ahora bien, si tienes pensado implementar diferentes funcionalidades para cada versión del operador + dependiendo del tipo fundamental, entonces tendrás que realizar las sobrecargas explícitamente.<br>
<br>
<br>
La otra posibilidad es que no necesitemos todas estas sobrecargas ya que podríamos simplemente usar el constructor de 'Fraccion'. Esto implica que sólo tenemos que implementar una sobrecarga del operador + que acepte dos objetos de tipo 'Fraccion'. Por ejemplo,<br>

<br>
class Fraccion<br>
{<br>
  ...<br>
  Fraccion( long double izq=0, long double der=1 );<br>
};<br>
<br>
Fraccion operator+( const Fraccion &izq, const Fraccion &der );<br>
<br>
Podemos hacer lo siguiente,<br>
<br>
Fraccion f(1,2);<br>
short int nNum=5;<br>
<br>
f = f + nNum;<br>
<br>
Aquí, implícitamente hacemos lo siguiente:<br>
operator+( f, Fraccion( (long double)nNum ) );<br>
<br>
<br>
Espero haber aclarado la duda.<br>
<br>
Steven<br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</blockquote></div><br>