C++ 使用动态\u转换指针时抛出错误的\u转换?
动态\u cast抛出C++ 使用动态\u转换指针时抛出错误的\u转换?,c++,pointers,casting,reference,C++,Pointers,Casting,Reference,动态\u cast抛出错误\u cast异常,如果您抛出引用,但正如我所知,在标准中指针被视为引用,即指针是引用的一种类型。 所以当我投射指针时,我应该得到坏的投射吗 这个问题源于来自的try-catch块。此try-catch块不合适吗?如果使用指针,则在错误转换的情况下,dynamic\u cast将返回一个null 另外,dynamic_cast仅适用于多态类,因此如果您谈论的是内置数据类型(从问题中的链接),那么您应该使用static_cast 顺便说一句,引用是而不是指针。如果指针转换
错误\u cast
异常,如果您抛出引用,但正如我所知,在标准中指针被视为引用,即指针是引用的一种类型。所以当我投射指针时,我应该得到坏的投射吗
这个问题源于来自的try-catch块。此try-catch块不合适吗?如果使用指针,则在错误转换的情况下,
dynamic\u cast
将返回一个null
另外,dynamic_cast仅适用于多态类,因此如果您谈论的是内置数据类型(从问题中的链接),那么您应该使用
static_cast
顺便说一句,引用是而不是指针。如果指针转换错误,则
动态转换将返回空值
另外,dynamic_cast仅适用于多态类,因此如果您谈论的是内置数据类型(从问题中的链接),那么您应该使用static_cast
顺便说一句,参考文献是而不是指针。关于最初的问题“那么我在投射指针时是否应该得到坏的投射?”,没有
这就是为什么你可以看到这样的结构
if( T* pT = dynamic_cast<T*>( p ) ) ... // use pT in if body
if(T*pT=dynamic_cast(p))…//在if体中使用pT
关于新问题“这个try-catch块不合适吗?”,不,它是一个try
-catch
块,用于捕获分配错误;它与动态\u cast
本身无关
干杯,嗯。关于最初的问题“那么我在投指南针时是否应该投坏球?”,没有
这就是为什么你可以看到这样的结构
if( T* pT = dynamic_cast<T*>( p ) ) ... // use pT in if body
if(T*pT=dynamic_cast(p))…//在if体中使用pT
关于新问题“这个try-catch块不合适吗?”,不,它是一个try
-catch
块,用于捕获分配错误;它与动态\u cast
本身无关
干杯,因为动态\u cast
不会抛出异常,所以其中一个try-catch块是完全不必要的
不过,您可以轻松定义自己的强制转换函数,该函数确实会为指针引发异常。这就是我在自己的代码中所做的(简化代码,请注意,我使用垃圾收集,这样我就可以毫无后果地抛出指针):
模板
内联类*cast(对象*obj)
{
等级*结果=动态施法(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
模板
内联常量类*强制转换(常量对象*对象)
{
常量类*结果=动态投影(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
另一方面,我还将其用作静态_cast的语法糖,但这只是因为我不将其用于动态_cast引用和常量引用:
template <class Class, class Object>
inline Class cast (const Object& obj)
{
return static_cast<Class>(obj);
}
模板
内联类转换(常量对象和对象)
{
返回静态_-cast(obj);
}
我想说的是,您最好实现自己的强制转换功能,该功能在异常处理方面是一致的,并且可以精确地执行您想要和期望的操作。我这样做了,但从来没有回头看。因为动态\u cast
不会抛出异常,所以其中一个try-catch块完全没有必要
不过,您可以轻松定义自己的强制转换函数,该函数确实会为指针引发异常。这就是我在自己的代码中所做的(简化代码,请注意,我使用垃圾收集,这样我就可以毫无后果地抛出指针):
模板
内联类*cast(对象*obj)
{
等级*结果=动态施法(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
模板
内联常量类*强制转换(常量对象*对象)
{
常量类*结果=动态投影(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
另一方面,我还将其用作静态_cast的语法糖,但这只是因为我不将其用于动态_cast引用和常量引用:
template <class Class, class Object>
inline Class cast (const Object& obj)
{
return static_cast<Class>(obj);
}
模板
内联类转换(常量对象和对象)
{
返回静态_-cast(obj);
}
我想说的是,您最好实现自己的强制转换功能,该功能在异常处理方面是一致的,并且可以精确地执行您想要和期望的操作。我这样做了,从来没有回头看。我不是说引用是指针,我是说指针是引用的一种类型。那真的是不同的事情!无指针不是一种引用类型,它们都是不同的things@Narek在C++术语中,“引用”用于引用。我同意这是一个非常尴尬的术语。但为了避免误解,我们需要非常小心地保持舌头笔直(或者不管英语中的惯用表达是什么!):-)如果它在指针转换过程中没有抛出,那么为什么链接中有try-cats块?这不合适吗?@Narek:如果你注意到了,链接中的代码在每次动态\u cast
后都会检查null。那里的try-catch
将捕获从new
引发的bad\u-alloc
异常,但即使是try-catch
也不适合这样做。是的,这是一个糟糕的例子。我不是说引用是指针,我说指针是引用的一种类型。那真的是不同的事情!无指针不是一种引用类型,它们都是不同的things@Narek在C++术语中,“引用”用于引用。我同意这是一个非常尴尬的术语。但为了避免误解,我们需要非常小心地保持舌头笔直(或者不管英语中的惯用表达是什么!):-)如果有