방문자 패턴의 예를 구현하려고하지만 클래스 선언의 순환 종속성에 문제가 있습니다. 클래스 방문자의 선언을 할 때, 러시아와 영국의 클래스는 메소드 방문을 가지고있는 것을 모릅니다 만, 메소드의 수락을 위해 Visitor의 선언을 연장하면, 영국과 러시아의 클래스를 사용할 필요가 있습니다. 방문자는 자신의 코드에서이 유형을 사용하고 있기 때문입니다. 코드를 주문하는 많은 변형을 시도했지만 완전히 실패했습니다. 제발, 내가 C++이 이걸 이해할 필요가있는 것을 이해하도록 도와주세요. 감사.선언의 순환 종속성
#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; }
그리고 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’
문제가 해결되지 않을까 걱정됩니다. 이제'vtable for Land '에 대한 정의되지 않은 참조와'typeinfo for Land'에 대한 정의되지 않은 참조가 많이 있습니다. – Martin
실제로 Land 클래스를 정의 했습니까? 아마 토지를 가상으로 만들고 싶다고 생각합니다. 클래스 Land { public : virtual ~ Land() {} virtual void accept (const Visitor * v) = 0; }; GCC가 아무 기능도 정의하지 않았기 때문에 GCC가 Land 용 vtable을 만들지 않았다는 오류가 있습니다. –
글쎄, Alexey이 문제를 해결했지만 새로운 문제가 발생합니다 : http://stackoverflow.com/questions/1748827/virtual-tables-are-undefined – Martin