Okrągłe zależności deklaracji
Próbuję zaimplementować przykład wzorca odwiedzającego, ale mam problem z kolistymi zależnościami deklaracji klas. Kiedy przekazuję deklarację klasy Odwiedzający, klasy Rosja i Anglia nie wiedzą, że Visitor odwiedza metodę, ale kiedy przedłużyłem deklarację użytkownika do akceptowania metody, muszę użyć klas Anglia i Rosja, ale muszą wiedzieć, kto Odwiedzający jest, ponieważ używają tego typu w swoim kodzie. Próbowałem wielu wariantów zamawiania kodu, ale całkowicie się nie udało. Proszę, pomóż mi zrozumieć, co C ++ musi uzyskać. Dzięki.
#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; }
I jest wyjście 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’