[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