2017-08-12 68 views
0

我有一个虚基类Shape如何检查一个指针是否指向一个虚拟基类而不是C++中的子类?

class Shape { 
public: 
    virtual bool intersect(Ray& r, HitRecord& rec)=0; 

    virtual Material material()=0; 
}; 

我认为其所谓的“纯虚”类。所以我认为我应该而不是尝试在任何时候实例化它。

不过,我有一个结构HitRecord存储指针的Shape子类,因为我不知道什么课究竟该指针指向,我通过Shape*定义它:

struct HitRecord { 
    float t; 
    vec3f p; // point coord 
    vec3f norm; 
    Shape* obj; 
}; 

我实际上是在试图建立一个光线追踪器,所以我有一个intersect()来检查光线是否与形状相交。如果光线不是与场景中的任何形状相交,则rec变量将不会改变,即rec.obj指向Shape

因此,每次发生这种情况,我都会得到一个BAD_ACCESS错误,因为**我想访问rec.obj的成员变量。它应该在rec.obj指向Shape的子类时起作用,但当它指向Shape时不起作用。

bool intersect(Ray& r, HitRecord& rec) { 
     rec.t = 100; 
     for (std::vector<Shape* >::iterator it = shapes.begin(); it != shapes.end(); ++it) { 
      HitRecord tmpRec; 
      if ((*it)->intersect(r, tmpRec) && tmpRec.t < rec.t) { 
       rec = tmpRec; 
      } 
     } 
} 

所以现在我想检查指针是否指向确切的Shape基类。我试过dynamic_cast,但似乎并不适合这种情况。

我想知道这是不是“设计问题”。如果没有,我如何检查指针是否指向Shape

+0

也许不是你在找的东西,但是许多调试器在检查基类指针时显示动态类型。 – ComicSansMS

+2

你怎么能够得出'obj'没有指向派生类型'Shape'的情况? (除了'nullptr'或未初始化。) – juanchopanza

+0

对不起,我是新来的c + +。在我的代码中,在'intersect()'中,如果'if'块永远不会到达,'rec'将不会被更新。当'rec'被传入'intersect()'时,它就被声明了('HitRecord rec;')。我不确定如果我没有明确地指定什么'obj'指向..? –

回答

1

您需要将您的HitRecord的obj指针初始化为空,否则它指向一个随机存储器地址。实现这一

一种方法是一个构造函数添加到HitRecord结构:

struct HitRecord { 
    HitRecord() : obj(0) {} 
    float t; 
    vec3f p; // point coord 
    vec3f norm; 
    Shape* obj; 
}; 

然后要测试的是rec.obj是否为空。

相关问题