Dependencias circulares de las declaraciones.

Estoy tratando de implementar un ejemplo de patrón de visitante, pero tengo problemas con las dependencias circulares de las declaraciones de clases. Cuando reenvío la declaración de clase Visitante, las clases de Rusia e Inglaterra no saben que el Visitante tiene visita de método, pero cuando extiendo la declaración de Visitante para el método de aceptación, necesito usar las clases Inglaterra y Rusia, pero necesitan saber quién Visitante es, porque están utilizando este tipo en su código. Probé muchas variaciones de ordenar el código, pero fallé completamente. Por favor, ayúdame a entender, lo que C ++ necesita para obtener esto. Gracias.

#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 ahí está la salida de 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’

Respuestas a la pregunta(6)

Su respuesta a la pregunta