Vale, muchas gracias creo que me has aclarado muchas dudas sobre este tema, ahora lo comprendo mejor.<br><br><div class="gmail_quote">2009/3/10 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;"><div class="im">Hola Vicente,<br>
<br>
vicente lozano wrote:<br>
</div><div class="im"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
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<br>
char* que debo usar, crear las 4 operaciones:<br>
<br>
Cadena& operator+( char*, char*)<br>
</blockquote>
<br></div>
Esta sobrecarga no es posible, porque los tipos de ambos operandos son fundamentales.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Cadena& operator+( char*, Cadena&)<br>
Cadena& operator+( Cadena&, char*)<br>
Cadena& operator+( Cadena&, Cadena&)<br>
<br>
</blockquote>
<br></div>
Estas sobrecargas no deberían retornar una referencia a un objeto, sino uno nuevo.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
o<br>
<br>
Usar templates<br>
<br>
o<br>
<br>
Sobrecargar el casting para que funcione como lo que me has comentado<br>
de los doubles?<br>
<br>
</blockquote>
<br></div>
Podrías, pero a veces esto crea más problemas que soluciones. Hay que tener mucho cuidado al sobrecargar cástings para clases.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
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<br>
poco sin pies ni cabeza pero llevo ya muchas horas por aqui jeje.<br>
</blockquote>
<br></div>
Esto es porque no hay que poner un tipo de retorno. Al tratarse de un cásting, ya se conoce el tipo de retorno. Esto sería,<br>
<br>
class Cadena<br>
{<br>
  ...<br>
  char *()  { return pstr; }<br>
};<br>
<br>
Ahora podemos hacer lo siguiente:<br>
<br>
Cadena cad;<br>
...<br>
int nLongitud = strlen(cad);<br>
<br>
Quiero aclarar que no es nada recomendable realizar este cásting, ya que estás cediendo acceso a la información directamente al exterior. Esto rompe la encapsulación que nos interesa. Lo que podemos hacer es hacer un cásting a 'const char *'.<div class="im">
<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
Y templates aun no lo he mirado pero vamos que cual creeis que es<br>
mejor opcion de las que sean posibles.<br>
<br>
</blockquote>
<br></div>
Sugiero la primera solución que planteas: crea las tres sobrecargas. Esto es,<br>
<br>
Cadena operator+( const char *, const Cadena& );<br>
Cadena operator+( const Cadena &, const char * );<br>
Cadena operator+( const Cadena &, const Cadena & );<br>
<br>
Como puedes ver, creamos un nuevo objeto el cual se retorna. También verás que aceptamos parámetros constantes.<br>
<br>
Como mencioné en el correo-e anterior, puedes implementar una sola versión con clases, porque 'const char *' puede ser promocionado a 'Cadena'. Esto significa que sólo tenemos que implementar esta sobrecarga:<br>

<br>
Cadena operator+( const Cadena &, const Cadena & );<br>
<br>
Las otras versiones existen indirecta pero implícitamente. Por ejemplo,<br>
<br>
Cadena cad1( "Hola" ), cad2( " mundo" ), cad3;<br>
<br>
cad3 = cad1 + cad2;     // operator+( cad1, cad2 )<br>
cad1 = "Adios" + cad2;  // operator+( Cadena("Adios"), cad2 )<br>
cad2 = cad3 + "!";      // operator+( cad3, Cadena("!") )<br>
<br>
Lo siguiente también se puede hacer, pero hay que crear un objeto temporal explícitamente:<br>
<br>
cad3 = Cadena("Hola") + " mundo";<br>
<br>
<br>
Espero que esto te sirva.<div><div></div><div class="h5"><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>
</div></div></blockquote></div><br>