2013-12-05 2 views
1

Итак, у меня большая проблема с круговой зависимостью. Мои классы Square.h и Circle.h наследуют Shape.h и используют двойную отправку, чтобы попытаться обнаружить столкновение между ними. Мои классы В настоящее время установлены в следующих рода модыC++ Полиморфная циркулярная зависимость с двойной отправкой

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 
+0

Не могли бы вы опубликовать некоторые ошибки? – razeh

+0

Почему вам нужны три версии 'detectCollision'? Should'nt 'Shape * 'достаточно? –

+0

@razeh, я обновил фрагмент ошибки. –

ответ

4

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

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

+0

Эй, правильно это, конечно, в правильном направлении, теперь он компилируется, когда абстрактные методы реализованы с простым возвратом false; заявления. Однако сказать, что я не в square.cpp внутри следующего определения метода 'BOOL Площадь :: detectCollision (Circle * круг) {' ' вернуть circle-> detectCollision (это),' ' }' ошибка в том, что мы указываем на неполный класс. Как это разрешено? –

+0

@ThomasAnderson Вам нужны как '#include" square.hpp', так и '#include" circle.hpp "' в верхней части обоих файлов реализации. Каждому классу нужен доступ ко всем другим классам. Только абстрактный класс должен видеть неполные декларации классов – Potatoswatter

+0

точно так же, спасибо за поддержку! –

1

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

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; 
}; 
Смежные вопросы