[C con Clase] Problema con dynamic_cast
srd4121 en njit.edu
srd4121 en njit.edu
Lun Dic 22 20:14:15 CET 2008
Hola Nuria,
Mensaje citado por: Núria Busom Figueres <meteorit666 en hotmail.com>:
>
> Hola a todos, a ver una pequeña duda, soy nueva con esto del
> dynamic_cast. El compilador me da error pero no entiendo porque, ¿podeis
> ayudarme?
>
> codigo:
>
> bool MyString::operator<=(const ComparableObject& d) const{
> const MyString& c=dynamic_cast <const ComparableObject&> (d);
Esto no tiene sentido. En todo caso, debería ser:
const MyString &c = dynamic_cast < const MyString & >( d );
Sin embargo, tienes un problema de diseño. Si el parámetro debe ser un objeto
(o referencia a un objeto) de la clase 'MyString', entonces escribe
explícitamente esta restricción en la lista de parámetros. Es decir, reescribe
la sobrecarga del operador así:
bool MyString::operator<=( const MyString &d ) const;
Si el parámetro pasado no tiene nada que ver con la clase 'MyString', entonces
el compilador te dará un error por el intento.
> int i=0;
> while (st[i]==c.st[i] && st[i++]!='\0');
> return (st[i]<=c.st[i]);
> }
>
> donde:
>
> #ifndef MYSTRING_H
> #define MYSTRING_H
>
> #include "ComparableObject.h"
> class MyString :public ComparableObject{
> char* st;
> ...
> };
> #endif
>
> El compilador dice:
>
> MyString.cc:217: error: invalid initialization of reference of type
> ‘const MyString&’ from expression of type ‘const ComparableObject’
>
No estoy seguro de si este error tiene que ver con la sentencia donde usas el
operador 'dynamic_cast<>'. Posiblemente tenga que ver específicamente con la
invocación del operador sobrecargado y no con su definición. Sin conocer la
forma en que usas este operador sobrecargado, no te puedo ayudar concretamente.
De todas maneras, ya te he solucionado un problema de diseño, por lo que no
necesitarás usar 'dynamic_cast<>' en este caso. Aún así, quiero resaltar que
usar este operador con referencias a objetos supone usarlo en un
bloque 'try/catch' porque este operador puede lanzar una excepción de
tipo 'bad_cast'. Si usas punteros a objetos, no hace falta meternos en el
sistema de excepciones, ya que una imposibilidad supondría retornar un puntero
nulo (cero).
Espero que esto te ayude.
Steven
Más información sobre la lista de distribución Cconclase