Vale me ha quedado claro con los datos numericos pero ahora me ha surgido una duda con las cadenas:<br><br>Si yo quiero sobrecargar + para que pueda sumar tipo miCadena con char* que debo usar, crear las 4 operaciones:<br>
<br>Cadena& operator+( char*, char*)<br>Cadena& operator+( char*, Cadena&)<br>Cadena& operator+( Cadena&, char*)<br>Cadena& operator+( Cadena&, Cadena&)<br><br>o<br><br>Usar templates<br><br>
o<br><br>Sobrecargar el casting para que funcione como lo que me has comentado de los doubles?<br><br>He escrito la primera y bien, pero no me parece lo mas apropiado. He intentado hacer la 3° poniendo:<br><br>char& char*() { return *pstr;}<br>
<br>pero no compila y ademas creo que eso que he escrito esta muy mal, un poco sin pies ni cabeza pero llevo ya muchas horas por aqui jeje.<br><br>Y templates aun no lo he mirado pero vamos que cual creeis que es mejor opcion de las que sean posibles.<br>
<br>Gracias de nuevo y saludos, me voy que hoy salgo un poco antes para cortarme el pelo :)<br><br><div class="gmail_quote">2009/3/10 vicente lozano <span dir="ltr"><<a href="mailto:vicentelozano@gmail.com">vicentelozano@gmail.com</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;">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" target="_blank">srd4121@njit.edu</a>></span><div><div></div><div class="h5"><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><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></div></div><br>
</blockquote></div><br>