SoloCodigo
Programación General => C/C++ => C++ Builder => Mensaje iniciado por: mscblazer en Viernes 29 de Agosto de 2008, 20:48
-
Saludos a todos los amigos del foro, lo que me trae aqui es un error que me da en un sencillo ejemplo que trato de desarrollar para conocer bien el patrón Visitante(Visitor) a continuación el código:
class TAnimal{ //Clase abstracta del elemento.
public:
virtual void Accept(TReaccion&)=0;
};
//Interfaz Clase hija
class TGato : Public TAnimal{ //Clase hija de TAnimal
public:
TGato();
virtual void Accept(TReaccion&);
};
//Implementación Clase hija
TGato::TGato(){} //constructor
void TGato::Accept(TReaccion& Visitante){
Visitante.visit(this); //Error E2316
}
//Clase abstracta del visitante
class TReaccion{
public:
virtual void visit(TGato*)=0;
};
class TAcariciar : public TReaccion{ //Interfaz clase hija del visitante
public:
TAcariciar();
virtual void visit(TGato*); //Error E2293
}
//Implementación clase hija del visitante...
TAcariciar::TAcariciar(){} //constructor
void TAcariciar::visit(TGato *Gatito){
cout << "Miau" << endl;
}
Y me dan los siguientes errores:
E2293 ) expected
E2316 'visit' is not a member of 'TReaccion'
Agradezco cualquier ayuda.
Gracias de adelantadas...
-
********** Error E2316
El problema es porque la variable "TReaccion& Visitante" la tienes que pasar con un puntero para que te tome el enlace dinámico. Te quedaria asi:
void TGato::Accept(TReaccion *Visitante){
Visitante->visit(this); //Error E2316
}
El otro error no se porque teda cuando cambies esto igual te compila ya bien.
Suerte, ya me cuentas
-
Ok, muy bien, pero ahora me da un error en la inclusión de las cabeceras, o sea, suponiendo que todas las clases estén en ficheros apartes:
Ej:
#include "Reaccion.h"
class TAnimal{ //Sea un Animal.h
public:
virtual void Accept(TReaccion*)=0;
};
#include "Animal.h"
class TGato : public TAnimal{// Gato.h
public:
TGato();
virtual void Accept(TReaccion*);
};
#include "Gato.h"
TGato::TGato(){} //Sea Gato.cpp
void TGato::Accept(TReaccion* Visitante){
Visitante->visit(this);
}
Cómo incluirías las cabeceras, porque es el error que me está dando...
Adjunté la imagen del error...
Gracias..
-
O bien tienes mal configurado el compilador (tienes que incluirle los directorios donde se encuentrar los ficheros .h o bien poner la ruta completa, rollo #include "C:CompiladorProyectoCabecerasGato.h") o bien no lo has guardado como .h sino .cpp.
-
Si, pero si tienes todos los ficheros en la misma carpeta, que yo sepa la dirección completa no es necesaria :brickwall:
-
tienes que utilizar en cada fichero la directiva IFNDEF, por que si lo incluyes por mas de un camino te sale un mensaje de redeclaracion de clases.
ej.
#ifndef _TGATO_
class TGato : Public TAnimal{ //Clase hija de TAnimal
public:
TGato();
virtual void Accept(TReaccion&);
};
#endif
Suerte, ya me cuentas.
-
Bueno, tienen razón, ya resolví perfectamente.
muchas gracias a todos por su apoyo... :good: