Круговые зависимости объявлений
Я пытаюсь реализовать пример шаблона посетителя, но у меня проблема с циклическими зависимостями объявлений классов. Когда я делаю пересылку декларации класса Visitor, классы Россия и Англия не делаютЯ не знаю, что у посетителя есть метод посещения, но когда я расширяю предварительное объявление Посетителя для принятия метода, мне нужно использовать классы Англия и Россия, но им нужно знать, кто такой Посетитель, поскольку они используют этот тип в своем коде. Я пробовал много вариантов упорядочения кода, но полностью провалился. Пожалуйста, помогите мне понять, что нужно С ++ для этого. Благодарю.
#include #include 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 *l; public: explicit Trip(vector *_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 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; }
И есть выход 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’