Итак, у меня большая проблема с круговой зависимостью. Мои классы Square.h и Circle.h оба наследуют Shape.h и используют двойную диспетчеризацию, чтобы попытаться обнаружить столкновение между ними. Мои занятия в настоящее время настроены следующим образом
Shape.h
class Shape {
public:
virtual bool detectCollision(Shape* obj) = 0;
virtual bool detectCollision(Square* obj) = 0;
virtual bool detectCollision(Circle* obj) = 0;
Square.h
#include "shape.h"class Square : public Shape {
public:
bool detectCollision(Shape* obj);
bool detectCollision(Square* obj);
bool detectCollision(Circle* obj);
Circle.h
#include "shape.h"class Circle: public Shape {
public:
bool detectCollision(Shape* obj);
bool detectCollision(Square* obj);
bool detectCollision(Circle* obj);
По сути, я хочу иметь возможность сделать что-то похожее на
Circle circle;
Square square;
Square square2;
circle.detectCollision(&square);
square.detectCollision(&square2);
Но я сталкиваюсь с несколькими ошибками, когда пытаюсь скомпилировать это. Очевидно, что при включении «Circle.h» внутри Square.h будет создаваться циклический цикл, который не будет выполняться. Кто-нибудь может предложить хорошее решение этой проблемы?
Очевидно, что обнаружение столкновений между двумя квадратами и окружностью и квадратом отличается, поэтому мне нужно как-то перегружать эти методы. Я думал, что это будет хорошим решением, какие-нибудь указатели?
Ошибки (Это те же ошибки компиляции или Square.cpp и Shape.cpp):
Circle.cpp
shape.h(12): error C2061: syntax error : identifier 'Square'
shape.h(13): error C2061: syntax error : identifier 'Circle'
shape.h(13): error C2535: 'bool Shape::detectCollision(void)' : member function already defined or declared
Вам просто нужны предварительные декларации.
class Square; // Declarations, not definitions.
class Circle;
class Shape {
// At this point, Square * and Circle * are already well-defined types.
// Square and Circle are incomplete classes though and cannot yet be used.
Я бы предложил использовать ссылки вместо указателей, так как nullptr
не является жизнеспособным аргументом, и const
— квалифицировать все, так как обнаружение столкновений не требует изменения чего-либо.
Вам необходимо заранее объявить классы:
class Square;
class Circle;
class Shape {
public:
virtual bool detectCollision(Shape* obj) = 0;
virtual bool detectCollision(Square* obj) = 0;
virtual bool detectCollision(Circle* obj) = 0;
};