-1

我正在尝试构建一个光线追踪器。我有一个名为 Shape 的类,我将其扩展到 Sphere 类(以及其他形状,如三角形)。形有法

virtual bool intersect(Ray) =0;

所以我创建了 Sphere 类

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

我有一个主类,用于创建形状指针列表。我创建一个球体指针并执行以下操作:

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 类型的对象。我在继承方面做错了什么?

4

1 回答 1

4

一个问题是:

Sphere *sph = &Sphere();

它创建一个类型为 的临时对象Sphere,存储指向该临时对象的指针,然后销毁该临时对象。结果是胡说八道。

将其更改为:

Sphere *sph = new Sphere();

事情会好得多。

于 2013-02-27T21:52:48.017 回答