Pakonigoosy
@Pakonigoosy
Разработчик ПО

Как правильно работать с интерфейсами?

У меня есть код, в котором я пытаюсь реализовать алгоритм GJK (алгоритм для нахождения пересечения двух фигур).
Основной файл gjk.h выглядит так:
#include "Vector.h"
#include "Collision.h"
#include "Simplex.h"
Vector support(IShape a, IShape b, Vector direction){
	Vector aFar = a.FarthestPointInDirection(direction);
	Vector bFar = b.FarthestPointInDirection(direction);
	return *aFar.Sub(bFar);
}
Collision Calculate(IShape a,IShape b){
	Simplex simplex = *(new Simplex());
	Vector direction = *new Vector(0,1);
	Vector initSupportPoint = support(a,b,direction);
	simplex.Add(initSupportPoint);
	direction = *direction.Invert();
	while(direction.null){
		Vector supportPoint=support(a,b,direction);
		if (supportPoint.Dot(direction)<=0){
			return *new Collision(a,b,true);
		}
		simplex.Add(supportPoint);
		direction=simplex.CalculateDirection();
	}
	return *new Collision(a,b,false);
}

Здесь используется IShape, который является интерфейсом. Он определен в своем файле IShape.h
#ifndef ISHAPE_H
#define ISHAPE_H
class IShape
{
	public:
		virtual Vector FarthestPointInDirection(Vector direction);
};

#endif

Есть два класса, которые этот интерфейс реализуют. Они находятся в своих файлах:
polygon.h
#ifndef POLYGON_H
#define POLYGON_H


class polygon : public IShape{
	public:
		vector<Vector> points;
		polygon(vector<Vector> points){
			this->points=points;
		}
		virtual Vector FarthestPointInDirection(Vector direction){
			int farthestDistance=-2147483647;
			Vector farthestPoint = *new Vector(0,0);
			for (int point = 0;point<this->points.size();point++){
				int distanceInDirection = this->points[point].Dot(direction);
				if (distanceInDirection>farthestDistance){
					farthestPoint=this->points[point];
					farthestDistance=distanceInDirection;
				}
				
			}
			return farthestPoint;
		}
};


#endif

Circle.h:
#ifndef CIRCLE_H
#define CIRCLE_H


class Circle : public IShape
{
	public:
		Vector center;
		int radius;
		
		Circle(int radius,Vector center)
		{
			this->radius=radius;
			this->center=center;
		}
		virtual Vector FarthestPointInDirection(Vector direction){
			float angle = atan2(direction.y,direction.x);
			return *new Vector(this->center.x+(this->radius*cos(angle)),
			this->center.y+(this->radius*sin(angle)));
		}
};

#endif

В файле main.cpp ничего нет, кроме
#include "gjk.h"
То есть функции никакие не вызываются.
Компилятор выдает следующую ошибку:
60ffc1cd3994e757357247.png
Как все-таки правильно использовать интерфейсы и что я делаю не так?
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
У вас какая-то беда с пониманием указателей.
В функцию нужно передавать указатель на IShape, если вы хотите работать с цепочкой наследования.
А вот конструкции типа
Simplex simplex = *(new Simplex());

- просто лютая дичь.
Ответ написан
Приблизительно так
class IShape
{
  public:
    virtual Vector FarthestPointInDirection(Vector direction) = 0; // pure virtual function
};

class Polygon : public IShape{
...
Vector FarthestPointInDirection(Vector direction) override{
....
}
};

Vector support(IShape& a, IShape& b, Vector direction){
 Vector aFar = a.FarthestPointInDirection(direction);
  Vector bFar = b.FarthestPointInDirection(direction);
  return *aFar.Sub(bFar);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы