问题标签 [dynamic-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - c++ dynamic_cast 错误处理
是否有任何与 dynamic_cast 错误处理相关的良好做法(除非在您不需要时不使用它)?我想知道我应该如何处理它可以抛出的 NULL 和 bad_cast 。我应该检查两者吗?如果我捕捉到 bad_cast 或检测到 NULL,我可能无论如何都无法恢复……现在,我正在使用 assert 检查 dynamic_cast 是否返回非 NULL 值。你会在代码审查中接受这个解决方案吗?
c++ - 什么可能导致 dynamic_cast 崩溃?
我有一段看起来像这样的代码:
有时它会崩溃:
我不知道它为什么会崩溃。obj不为空(如果是的话,它不会是一个问题,不是吗?)。
动态演员崩溃的原因可能是什么?
如果它不能转换,它应该只返回 NULL no 吗?
c++ - 安全地检查变量的类型
对于一个系统,我需要将指针转换为 long 然后将 long 转换回指针类型。你可以猜到这是非常不安全的。我想做的是使用 dynamic_cast 进行转换,所以如果我混合它们,我会得到一个空指针。这个页面说http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=/com.ibm.vacpp7l.doc/language/ref/clrc05keyword_dynamic_cast.htm
dynamic_cast 运算符在运行时执行类型转换。dynamic_cast 运算符保证将指向基类的指针转换为指向派生类的指针,或将引用基类的左值转换为对派生类的引用。因此,程序可以安全地使用类层次结构。此运算符和 typeid 运算符在 C++ 中提供运行时类型信息 (RTTI) 支持。
如果它为空,我想得到一个错误,所以我编写了自己的动态演员表
使用 MSVC,我收到错误“错误 C2681:'long':dynamic_cast 的无效表达式类型”。事实证明,这只适用于具有虚函数的类...... WTF!我知道动态转换的重点是针对向上/向下转换继承问题,但我也认为它是为了动态解决类型转换问题。我知道我可以使用 reinterpret_cast 但这并不能保证相同类型的安全性。
我应该用什么来检查我的类型转换是否是同一类型?我可以比较这两个 typeid,但是当我想将派生的类型转换为它的基时会遇到问题。那么我该如何解决呢?
c++ - 带接口的动态转换
我有一个实现 2 个接口并继承 1 个类的类。所以,通常它看起来像这样:
代码中有一点我有一个IB *
,但实际上可以使用一个A *
. 我希望动态演员是这样的:
不幸的是,这不起作用。有没有合适的方法来做到这一点?还是我应该实施解决方法?我曾考虑过同时拥有IB
并IC
从虚拟继承A
,但上次我尝试 IIRC 时,有一些并发症使其不受欢迎。
有什么想法吗?
编辑:哦,是的,这是插件 API 的一部分,所以不幸的是我无法直接访问T
我需要的类型A *
。我的示例彼此相邻,但如前所述,它更复杂。基本上我有 2 个共享库。T
和T1
(我有一个IB *
)都是实现插件 API 的类,并且是共享库的内部。
澄清一下:这是我的典型插件的更具体示例(它们位于单独的库中):
插件A:
插件 B:
编辑:我猜问题是 pluginA 和 pluginB 在不同的共享库中。也许 rtti 不跨越模块边界。我认为可能是这种情况,因为人们的示例在我的测试中似乎运行良好。具体来说,如果我对它执行“nm”,pluginB 就没有“PluginA 的类型信息”。这可能是问题的核心。如果是这种情况,我只需通过虚拟继承或cast_to_qobject()
我的一个接口中的虚拟函数来解决它。
c++ - 如何在我的 C++ 代码中避免 dynamic_cast?
假设我有以下类结构:
让我们也给它Car
一个句柄Engine
。AFooCar
将由 a 创建,FooEngine*
aBarCar
将由 a 创建BarEngine*
。有没有办法安排事情,以便FooCar
对象可以调用成员函数而FooEngine
无需向下转换?
这就是为什么类结构按现在的方式布局的原因:
- 所有
Car
s 都有一个Engine
. 此外, aFooCar
只会使用 aFooEngine
。 - 所有
Engine
s 共享的数据和算法我宁愿不复制和粘贴。 - 我可能想编写一个需要
Engine
知道它的函数Car
。
在编写这段代码时,我一打字dynamic_cast
就知道我可能做错了什么。有一个更好的方法吗?
更新:
根据目前给出的答案,我倾向于两种可能性:
- 已经
Car
提供了一个纯虚getEngine()
函数。这将允许FooCar
并BarCar
拥有返回正确类型的Engine
. Engine
将所有功能吸收到Car
继承树中。Engine
出于维护原因(将这些Engine
东西保存在一个单独的地方)。这是拥有更多小类(小代码行)与拥有更少大类之间的权衡。
社区是否对其中一种解决方案有强烈的偏好?有没有我没有考虑过的第三种选择?
c# - C#:动态转换类型
我目前有这种类型的代码:
假设 SomeClassType1 和 SomeClassType2 具有我想要分配的相同属性集(尽管它们在其他属性中可能不同),是否可以将 MainObject 动态转换为适当的类型,然后分配值,而无需复制代码?这就是我最终希望看到的:
显然 C# 抱怨找不到 DynamicType:
找不到类型或命名空间名称“DynamicType”(您是否缺少 using 指令或程序集引用?)
在 C# 2.0 中这样的事情可能吗?如果它比我当前的代码更混乱,那么我认为这样做没有任何意义,但我很想知道。谢谢!
编辑:澄清一下,我完全理解实现接口是最合适且可能正确的解决方案。也就是说,我更感兴趣的是如何在不实现接口的情况下做到这一点。感谢您的精彩回复!
c++ - 我应该如何区分子类
我有一个看起来像这样的令牌类:
所以基本上我必须在 Token 类中定义每个子类;结果并没有那么糟糕,因为子类很少,我无法想象它们会发生变化。但是,与使用动态转换识别子类相比,它仍然丑陋、笨拙且“正确”。然而:
也很笨拙。特别是当我必须将它们串在一个大的嵌套 if 中时。
那你会用哪个?这个问题还有其他解决方案吗?
注意:我知道无论如何我都必须强制他们获取各自的数据,但是
- 在我使用它们的功能之前,我不会施放它们,所以感觉更干净
- 我比使用他们的数据更频繁地测试他们的类型。
注意2:上面代码中没有说明的是这些token也是一个链表。这使得模板变得困难(aToken<int>
可能指向 aToken<string>
等)。这就是为什么我需要一个 Token 类作为父类开始的原因。
c++ - dynamic_cast 失败
我有一个基类和一个派生类。每个类都有一个 .h 文件和一个 .cpp 文件。
我正在以下代码中将基类对象动态转换为派生类:
h 文件:
cpp 文件:
由于某种奇怪的原因,转换失败(返回 NULL)。但是,如果我将 Derived 类的构造函数的实现从 .h 移动到 .cpp 文件,则转换成功。
什么会导致它?
编译器是 gcc 3.1,在 Linux-SUSE 上。顺便说一句,我只在这个平台上看到这种行为,并且相同的代码在 Visual Studio 中运行良好。