动态铸造后没有捕获坏的铸件

时间:2014-11-30 14:55:06

标签: c++

如何使用非const Triangle指针成功传递尝试?

const Triangle *prim;
const GeometricPrimitive *gp;
try {
    gp = dynamic_cast<const GeometricPrimitive*>(primitives[edges[axis][j].primNum].GetPtr());
    prim = dynamic_cast<const Triangle*>((gp->shape).GetPtr());
}
catch (std::bad_cast& bc) {
    continue;
}

enter image description here

template <typename T> class Reference {
public:
    ...
    T *operator->() { return ptr; }
    const T *operator->() const { return ptr; }
    operator bool() const { return ptr != NULL; }
    const T *GetPtr() const { return ptr; }
private:
    T *ptr;
};

编辑: enter image description here

2 个答案:

答案 0 :(得分:5)

dynamic_cast的语义在§5.2.7/ 8中描述:

  

如果CT指向或引用的类类型,则为运行时   检查逻辑执行如下:

     

- 如果,在最派生的对象中   指向(引用)vv点(指)公共基础   C对象的class子对象,如果只有一个C类型的对象   从v结果指向(引用)的子对象派生而来   点(指)C对象。

     

- 否则,如果v指向(引用)公共基类子对象   最派生对象的类型,以及派生最多对象的类型   有一个类型为C的基类,它是明确的,公开的,   结果点(引用)到派生最多的C子对象   对象

     

- 否则,运行时检查失败

第9段:

  

失败的强制转换为指针类型的值是空指针   值所需的结果类型。失败的强制转换为引用类型   抛出std::bad_cast(18.7.2)。

注意:您应该为<typeinfo>添加std::badcast

答案 1 :(得分:4)

只有在您投射参考时才会出现

bad_cast: 尝试这样的事情:

Triangle prim;
GeometricPrimitive gp;
try {
    gp = dynamic_cast<const GeometricPrimitive &>(*(primitives[edges[axis][j].primNum].GetPtr()));

    prim = dynamic_cast<const Triangle &>(*((gp->shape).GetPtr()));

}
catch (std::bad_cast& bc) {
    continue;
}