У меня есть абстрактный базовый класс под названием Shape
, который выглядит примерно так:Реализация абстрактного метода «перекрытий» для разных фигур?
class Shape {
public:
Shape(Point center);
virtual bool overlaps(Shape *other) = 0;
private:
Point m_center; // has getter&setter
};
У меня возникли проблемы с методом overlaps(Shape *other);
; Я не знаю, как реализовать его в подклассах.
Давайте рассмотрим два примера: (возможно, у меня будет не более двух или трех форм) Circle
и Rect
. В основном то, что я пытался это создать две перегрузки в обоих классах после того, как с использованием прямого заявления, чтобы позволить Circle
и Rect
«знать» друг с другом:
virtual bool Rect::overlaps(Circle *other);
virtual bool Rect::overlaps(Rect *other);
virtual bool Circle::overlaps(Circle *other);
virtual bool Circle::overlaps(Rect *other) { return other->overlaps(this); }
Теперь легко реализовать математику внутри всех перегрузках ; однако, я получу ошибку cannot allocate an object of abstract type 'Circle'
и note: virtual bool Unit::overlaps(Unit *)
. Это связано с тем, что классы Circle
и Rect
имеют только методы с Circle *
и Rect *
в качестве их параметров, но без Unit *
.
Я также попытался вперед declarating Circle
и Rect
в моем shape.h, но так как вперед заявление не являются одними и теми же классами, как мой фактический Circle
и Rect
, я только получаю ту же ошибку.
Не удаляя общий базовый класс, существует ли способ реализовать такое поведение? Или есть обходное решение, чтобы заставить его работать?
Дополнительная информация
У меня есть 2D World
класс, который содержит vector<Shape *> m_shapes;
и мне нужно будет увидеть, если две фигуры накладываются друг на друга;
for (unsigned int i = 0; i < m_shapes.size(); i++) {
if (certainShape->overlaps(m_shapes[i])) {
collapse();
}
}
Это называется [двойная отправка] (http://en.wikipedia.org/wiki/Double_dispatch) проблема –