• Viernes 8 de Noviembre de 2024, 09:52

Autor Tema:  Problemas De Cast  (Leído 1077 veces)

solarin

  • Miembro activo
  • **
  • Mensajes: 36
    • Ver Perfil
Problemas De Cast
« en: Miércoles 16 de Agosto de 2006, 12:09 »
0
Hola foro,

Tengo las siguientes clases:

-Component
-Client
-Logger

Component es una interfaz que usa el patron singleton:

Component.h
Código: Text
  1.  
  2. class Component
  3. {
  4. public:
  5.      virtual void Metodo1();
  6.      Component* GetInstance();
  7. private:
  8.       Component* _Instance;
  9.  
  10. };
  11.  
  12.  

Con su implementacion:

Component.cpp

Código: Text
  1.  
  2. #include "Component.h"
  3. #include "Logger.h"
  4.  
  5. Component* Component::GetInstance()
  6. {
  7.   if (_Instance == 0)
  8.   {
  9.     _Instance = new Logger;
  10.   }
  11.  
  12.   return _Instance;
  13.  
  14. }
  15.  
  16. void Component::Metodo1(){}
  17.  
  18.  


Logger es la clase que implementa esta interfaz:

logger.h
Código: Text
  1.  
  2. #include "Component.h"
  3. #include "Client.h"
  4.  
  5. class Logger : public Component
  6. {
  7.  
  8. public:
  9.  
  10.   Logger();
  11.   ~Logger();
  12.         void Metodo1();
  13.  
  14.  
  15.  

Con su implementacion:

Logger.cpp
Código: Text
  1.  
  2.  
  3. void Logger::Metodo1()
  4. {
  5.   //Alguna accion por hacer
  6. }
  7.  
  8.  

En ultimo lugar tengo la clase Client, que es la clase desde la se accedera a la interfaz "component"

Client.h

Código: Text
  1.  
  2.  
  3. #include "Logger.h"
  4. #include "Component.h"
  5.  
  6. class Client
  7. {
  8. public:
  9.  
  10.   Client();
  11.   ~Client();
  12.       void   EnviaMiss();
  13.  
  14. private:
  15.    
  16.     Logger *the_Component;
  17. };
  18.  
  19.  

Con su implementacion:


Client.cpp

Código: Text
  1.  
  2. #include "Client.h"
  3.  
  4. Client::Client()
  5. {
  6.     the_Component = new Logger;
  7. }
  8. Client::~Client()
  9. {
  10.     delete the_Component;
  11. }
  12. void Client::EnviaMiss()
  13. {
  14.      the_Component= the_Component->GetInstance();
  15.      the_Component->Metodo1();      
  16. }
  17.  
  18.  
  19.  
  20.  

El error me aparece al compilar cuando intento hacer el "GetInstance()" dentro del metodo EnviaMiss, con el siguiente mensaje:

Client.cpp : error C2440: '=' : no se puede realizar la conversión de 'Component *' a 'Logger *'
   La conversión de la base al elemento derivado requiere dynamic_cast o static_cast


Alguna recomendacion de que hacer con este error?

Gracias.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Problemas De Cast
« Respuesta #1 en: Jueves 17 de Agosto de 2006, 00:08 »
0
Recién estoy leyendo el tema :), pero me parece que la razón es la siguiente.

Un Logger "es un" Component en tu código, pero un Component "no es un" Logger, por ello el compilador no permite la asignación directa de la dirección de un objeto Component a un apuntador de tipo Logger, ya que el tipo Logger pudiera tener funciones extra implementadas además de las de Component y, cuando intentaras llamarlas mediante el apuntador de tipo Logger tendrías efectos indeseados.

Ahora, el compilador si permite dicha asignación si realizas la conversión de manera explícita, por ello el mensaje:
Citar
La conversión de la base al elemento derivado requiere dynamic_cast o static_cast
Prueba haciendo el cast:
Código: Text
  1.  
  2. void Client::EnviaMiss()
  3. {
  4.     the_Component= static_cast<Logger*>( the_Component->GetInstance() );
  5.     the_Component->Metodo1();      
  6. }
  7.  
  8.  

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

solarin

  • Miembro activo
  • **
  • Mensajes: 36
    • Ver Perfil
Re: Problemas De Cast
« Respuesta #2 en: Jueves 17 de Agosto de 2006, 08:22 »
0
Muchas gracias por la explicacion y la solucion. Funciona perfectamente  :D