Что плохого в том, как я переопределяю этот метод?

Я пытаюсь построить трассировщик лучей. У меня есть класс Shape, который я расширяю до класса Sphere (и других фигур, например, треугольников). Форма имеет метод

virtual bool intersect(Ray) =0;

И поэтому я создаю класс Sphere

class Sphere : public Shape{
public:
Sphere(){};
bool intersect(Ray){/*code*/};
};

У меня есть основной класс, который я использую для создания списка указателей Shape. Я создаю указатель Sphere и делаю следующее:

Sphere* sph = &Sphere();
shapes.emplace_front(sph); //shapes is a list of Shape pointers

Затем, когда я хочу отследить луч в другом классе, я делаю следующее:

for (std::list<Shape*>::iterator iter=shapes.begin(); iter != shapes.end(); ++iter) {
Shape* s = *iter;
bool hit = (*s).intersect(ray);
}

Но я получаю сообщение об ошибке, что не могу вызвать interse для виртуального класса Shape, даже если * s указывает на объект типа Sphere. Что я делаю не так с наследованием?

-1

Решение

Одна проблема заключается в следующем:

Sphere *sph = &Sphere();

Создает временный объект типа Sphere, сохраняет указатель на это временное, а затем уничтожает временное. Результат чепуха.

Измените это на это:

Sphere *sph = new Sphere();

все будет работать намного лучше.

4

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

Других решений пока нет …

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