为什么当我使用dynamic_cast时会发生此错误?
why this error happens when I use dynamic_cast?
我想向下投射一个对象,但它会导致"无法dynamic_cast"错误。 (来源不是类类型(
问题出在哪里??
这是我的代码,
class A{...}
class B: public A{...}
A& x;
dynamic_cast<B&>(&x))!=0 //error here (source is not of class type)
只能将类类型dynamic_cast
到引用。
问题出在哪里??
正如错误所说,&x
表达式的结果不是类类型。它是一种指针类型。您尝试dynamic_cast
指向引用的指针。这是不可能的。
引用和指针之间的类型不匹配,因此不应编译代码。由于您正在检查空指针,因此您显然想要处理指针,因此代码应该是按此一般顺序排列的:
class A{...}
class B: public A{...}
A& x;
if (dynamic_cast<B *>(&x))!=0)
// cast was successful
else
// cast wasn't successful
您也可以在整个过程中使用引用,但如果这样做,则会通过抛出std::bad_cast
异常来发出不成功的转换信号:
void f(A &a) {
try {
B &b = dynamic_cast<B &>(a);
b.do_something_specific_to_b();
}
catch (std::bad_cast const &b) {
// `a` wasn't of type `B`
}
}
但是请注意,dynamic_cast
主要用于以下情况,在这种情况下,您将指针/引用作为参数接收,或者对于指针集合之类的内容,其中一些指针可能指向各种不同的类型:
std::vector<A *> objects;
for (auto const *a : objects) {
B *b = dynamic_cast<B *>(a);
if (b != nullptr)
b->do_B_specific_stuff();
else
a->do_generic_A_stuff();
}
最后,我要指出的是,如果你发现自己经常使用dynamic_cast
,那么你很有可能做错了什么。早在C++存在之前,我就已经使用dynamic_cast
了,在它存在的时间内,我不得不使用它的次数可能可以用一只手的手指来计算(还剩下几只手(。有些时间和地点是有用的(还有一些地方真的很重要(,但它们确实相当不寻常。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 错误:"cast"未命名类型void setCastDescription(std::string
- C++:"Expected '(' for function-style cast or type construction"错误
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- static_cast会丢弃错误,但C风格的演员cast有效
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 错误 C2440: 'type cast':无法从 'bool' 转换为 'CString'
- "Expected '(' for function-style cast or type construction"错误是什么意思?
- <function-style-cast> 错误:无法从'initializer list'转换为'std::thread'
- 编译错误:C/ c++中cast void *失败
- dynamic-cast-c++dynamic_cast错误处理