2013-02-27 3 views
-1

Я пытаюсь построить трассировщик лучей. У меня есть класс под названием 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); 
} 

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

ответ

4

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

Sphere *sph = &Sphere(); 

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

Изменить его к этому:

Sphere *sph = new Sphere(); 

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

+0

Спасибо, я думаю, что сделал это. –

Смежные вопросы