2013-02-27 93 views
-1

我在试图建立一个射线追踪器。我有一个名为Shape的类,我将它扩展到Sphere类(以及其他形状,如三角形)。形状有方法我重写此方法的方式有什么问题?

virtual bool intersect(Ray) =0; 

所以我通过

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上,尽管它应该是* s指向一个Sphere类型对象。我在做什么错误的继承?

回答

4

的一个问题是这样的:

Sphere *sph = &Sphere(); 

它创建Sphere类型的临时对象,存储一个指针到该临时,然后破坏临时。结果是无稽之谈。

它改成这样:

Sphere *sph = new Sphere(); 

事情会好得多。

+0

谢谢,我认为那样做了。 – 2013-02-27 22:00:19