我正在尝试构建一个光线跟踪器。我有一个名为Shape的类,我将其扩展到Sphere类(以及其他形状,如三角形)。 Shape有方法
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上调用intersect,即使它应该是* s指向Sphere类型对象。我的继承错误是什么?
答案 0 :(得分:4)
一个问题是:
Sphere *sph = &Sphere();
它创建一个类型为Sphere
的临时对象,存储指向该临时对象的指针,然后销毁该临时对象。结果是无稽之谈。
将其更改为:
Sphere *sph = new Sphere();
事情会好得多。