Programación General => C/C++ => Mensaje iniciado por: solarin en Miércoles 16 de Agosto de 2006, 12:09
Título: Problemas De Cast
Publicado por: solarin en Miércoles 16 de Agosto de 2006, 12:09
Hola foro,
Tengo las siguientes clases:
-Component -Client -Logger
Component es una interfaz que usa el patron singleton:
Component.h
Código: Text
class Component
{
public:
virtual void Metodo1();
Component* GetInstance();
private:
Component* _Instance;
};
Con su implementacion:
Component.cpp
Código: Text
#include "Component.h"
#include "Logger.h"
Component* Component::GetInstance()
{
if (_Instance == 0)
{
_Instance = new Logger;
}
return _Instance;
}
void Component::Metodo1(){}
Logger es la clase que implementa esta interfaz:
logger.h
Código: Text
#include "Component.h"
#include "Client.h"
class Logger : public Component
{
public:
Logger();
~Logger();
void Metodo1();
Con su implementacion:
Logger.cpp
Código: Text
void Logger::Metodo1()
{
//Alguna accion por hacer
}
En ultimo lugar tengo la clase Client, que es la clase desde la se accedera a la interfaz "component"
Client.h
Código: Text
#include "Logger.h"
#include "Component.h"
class Client
{
public:
Client();
~Client();
void EnviaMiss();
private:
Logger *the_Component;
};
Con su implementacion:
Client.cpp
Código: Text
#include "Client.h"
Client::Client()
{
the_Component = new Logger;
}
Client::~Client()
{
delete the_Component;
}
void Client::EnviaMiss()
{
the_Component= the_Component->GetInstance();
the_Component->Metodo1();
}
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.
Título: Re: Problemas De Cast
Publicado por: Geo en Jueves 17 de Agosto de 2006, 00:08
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