полиморфизм — C ++ Полиморфные круговые зависимости с двойной диспетчеризацией

Итак, у меня большая проблема с круговой зависимостью. Мои классы 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

1

Решение

Вам просто нужны предварительные декларации.

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— квалифицировать все, так как обнаружение столкновений не требует изменения чего-либо.

4

Другие решения

Вам необходимо заранее объявить классы:

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;
};
1

По вопросам рекламы [email protected]