Я пытаюсь построить трассировщик лучей. У меня есть класс 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. Что я делаю не так с наследованием?
Одна проблема заключается в следующем:
Sphere *sph = &Sphere();
Создает временный объект типа Sphere
, сохраняет указатель на это временное, а затем уничтожает временное. Результат чепуха.
Измените это на это:
Sphere *sph = new Sphere();
все будет работать намного лучше.
Других решений пока нет …