Estoy tratando de implementar un ejemplo de patrón de visitante, pero tengo problemas con las dependencias circulares de las declaraciones de clases. Cuando hago la declaración adelante de clase Visitante, las clases Rusia e Inglaterra no saben que el Visitante tiene la visita del método, pero cuando extiendo la declaración adelante del Visitante para la aceptación del método, necesito usar clases Inglaterra y Rusia, pero necesitan saber quién El visitante lo está, porque están usando este tipo en su código. Probé muchas variaciones para ordenar el código, pero fallé por completo. Por favor, ayúdame a entender lo que C++ necesita para conseguir esto. Gracias.Dependencias circulares de las declaraciones
#include <cstdio> #include <vector> using namespace std; class Visitor; class Land { public: virtual void accept(const Visitor *v); }; class England : public Land { public: void accept(const Visitor *v) { v->visit(this); } }; class Russia : public Land { public: void accept(const Visitor *v) { v->visit(this); } }; class Visitor { public: void visit(const England *e) const { printf("Hey, it's England!\n"); } void visit(const Russia *r) const { printf("Hey, it's Russia!\n"); } }; class Trip { private: vector<Land> *l; public: explicit Trip(vector<Land> *_l):l(_l) {} void accept(Visitor *v) { for (unsigned i = 0; i < l->size(); i++) { l->at(i).accept(v); } } }; int main() { England england; Russia russia; vector<Land> trip_plan; trip_plan.push_back(england); trip_plan.push_back(russia); trip_plan.push_back(england); Trip my_trip(&trip_plan); Visitor me; my_trip.accept(&me); return 0; }
Y no es la salida g ++
c++ -ansi -Wall -Wextra -Wconversion -pedantic -Wno-unused-parameter -o vp vp.cc vp.cc: In member function ‘virtual void England::accept(const Visitor*)’: vp.cc:40: error: invalid use of incomplete type ‘const struct Visitor’ vp.cc:30: error: forward declaration of ‘const struct Visitor’ vp.cc: In member function ‘virtual void Russia::accept(const Visitor*)’: vp.cc:47: error: invalid use of incomplete type ‘const struct Visitor’ vp.cc:30: error: forward declaration of ‘const struct Visitor’
Tengo miedo de que esto no resuelva el problema. Ahora obtengo mucha: referencia indefinida a 'vtable for Land ', y referencia indefinida a' typeinfo for Land'. – Martin
¿De hecho has definido la clase Land en cualquier lugar? Creo que probablemente ha querido hacer que la Tierra sea puramente virtual: clase Tierra { public: virtual ~ Land() {} virtual void accept (const Visitor * v) = 0; }; El error que está viendo es que GCC no ha creado el vtable para Land porque nunca definió funciones para él. –
Bueno, Alexey resolvió este problema, pero aparece un nuevo problema: http://stackoverflow.com/questions/1748827/virtual-tables-are-undefined – Martin