问题标签 [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.

0 投票
5 回答
3278 浏览

c++ - 动态转换、对象列表转换、模板

有2个类:

和一个通用容器

} ;

有 4 个容器的对象

是否允许这些转换(上/下):

有什么方法可以将对象列表转换为父对象列表,反之亦然?

更新的问题

那么 reinterpret_cast 呢?

0 投票
1 回答
289 浏览

c++ - 当具有 C++ python 扩展的库用作 RHEL5 上的插件时,动态转换返回 null

我有一个带有 C++ python 扩展的库(C++ 调用 python,而后者又调用 C++)使用 boost::python 和 python 库(这很混乱,但很多都是遗留的),当独立测试时可以正常工作。特别是,某个 dynamic_cast 可以正常工作。

但是,当使用 gcc 4.1.2 和外部应用程序将该库打包用作 RHEL5 上的插件时,dynamic_cast 返回 NULL 导致应用程序无法按预期工作。在 Windows 上(使用 Visual Studio 2005 和 2008 测试 Vista 64 位)它工作正常。例如,当我使用 ddd 进行调试时,我可以看到转换前的指针具有正确的 type_name (我想像往常一样被编译器轻微损坏?)。此处的任何特定调试技巧也会有所帮助。

reinterpret_cast 解决了这个问题。虽然这肯定会受到阻碍,但我不知道如何进行,尤其是。因为这可能是由于外部应用程序的问题。这是一个令人费解的混乱,几乎看起来是徒劳的,但如果它可以帮助这里有一些示例代码。下面的 C++ 片段创建了一个“smart_handle”来对存储在字符串“input”中的某些 python 命令进行排队。字符串 IMPORT 导入一些函数的位置和定义,这些函数在函数调用 py_api::execute_py_command 中被 boost::python::exec(..) 调用:

make_smart_handle 定义为:

函数 set_command_queue 在 python __init__.py 中定义为:

现在,在单独的 python 文件中定义的实际 python 函数 func1、func2 等调用命名空间“namesp”下定义的 C++ 函数。这些 C++ 函数的第一行是通过以下方式将“smart_handle”恢复到“queue”:

正是在上述函数 smart_handle_cast 中,当库用作外部应用程序中的插件时,使用了返回 NULL 的 dynamic_cast。使用 reinterpret_cast 可以使其正常工作。smart_handle_cast 返回一个 const boost::weak_ptr。对于那些感兴趣的人,这里是 smart_handle_cast<..>() 函数的定义:

0 投票
3 回答
21081 浏览

c++ - 将 NULL/0 传递给 dynamic_cast 的便携安全?

出于检查空指针的习惯,我有时会写:

实际上,在传递给动态转换之前检查空指针,并检查返回。

然后我阅读了 MSDN 文档

空指针值通过 dynamic_cast 转换为目标类型的空指针值。

看来我可以安全地删除 ?: 构造。这是 C++可移植的吗?

这样新的代码将是

当然假设someBasePtr为空或有效,即不是指向垃圾的狂野......

0 投票
2 回答
248 浏览

c++ - C++ 设计问题:通过模板传递函数?

提前感谢您的阅读。这是一个挑剔的设计问题,因为我有一个足够的解决方案,但如果没有更好的模板方式,我对此不是很有经验。

我需要存储一系列类型的数据表(派生自抽象类 DataTable)。我编写了一个“DataTableIndex”抽象类,它存储一个向量 DataTable* 并处理所有 DataTableIndexes 共有的一般工作——进行查找、实现代理模式以便仅在需要时加载表、错误检查等。

然后我为每个表类型子类化它,我需要这样做的唯一原因是因为每个表类型都有一个特定的函数可以调用来加载它。

如果可能的话,我想通过模板以某种方式避免这种 DataTableIndex 的子类化,因为 DataTable 有很多子类。

这个类有非常简单的子类,它们基本上指向用户界面类中实际打开和解析数据表文件的函数。

这工作得很好。但我觉得我应该能够通过模板参数将“loadTableTypeA”例如传递给 DataTableIndex,所以我不必对它进行子类化。

我想使用模板的另一个原因是我不想一直将 DataTable* 强制转换为实际的表类型。即使我在编译时知道它应该是什么类型的表,我觉得我应该使用 dynamic_cast<> 进行错误检查,但我不希望 getTable() 的调用者每次都必须这样做(它经常被调用)。

我理想的解决方案是: 1) 将 DataTableIndex 类泛化为模板,用模板参数替换 _lookupTable 和 _theTables 中的 LookupEntry* 和 DataTable*。这将消除铸造。

2) 映射适当的 UI 函数以加载正确的表类型,无需子类化。

所以基本上我想使用这个类看起来像这样(不知何故)

我对策略类进行了一些思考,但我对这种方法的印象是,在这种情况下,我只是将子类化移动到其他东西。

0 投票
4 回答
3100 浏览

c++ - c++ dynamic_cast

我知道“派生的基础”演员表是错误的。但它的内在原因是什么?里面的逻辑原因是什么?我猜如果没有更多解释,很难记住这一点。谢谢你!

0 投票
3 回答
2372 浏览

c++ - 检查交叉演员是否可行?

我知道使用dynamic_cast跨类层次结构进行“交叉转换”是合法的。例如,如果我有如下所示的类:

如果我有一个A*指向 type 对象的指针C,那么我可以使用

获取指向我指向的B基础对象的指针。C

我提到这一点的原因是,在我编写上述代码时,编译器可能还没有看到 的定义,C即使它已经看到了Aand B。这意味着编译器可能没有检测到 and 之间的任何类型的连接AB但它仍然必须编译代码,因为这样的类可能C存在并且dynamic_cast在某些情况下成功。

问题是这意味着我可能会意外地交叉转换为错误类型的对象。假设我有如下所示的类:

这里,D是一些随机不相关的类。如果我尝试写这样的东西:

那么这dynamic_cast在运行时总是会失败,因为没有办法连接AD. 如果我D因为我打算使用而意外使用B,编译器将不会给我任何迹象表明我有一个毫无意义的演员表。

我的问题是:有什么方法可以让编译器警告我强制转换在运行时总是会失败? 对于可以检测到这一点的任何主要编译器,我都会对语言级解决方案或某些编译器设置感到满意。如果有外部工具,那也没关系;我只想知道是否有可能捕获此类错误。

0 投票
1 回答
2533 浏览

c++ - 所以我不能 dynamic_cast< functionPointer >( ((void*)(myFuncPtr)) )?我该怎么办?

我有一个基类 Parameter 和两个派生类:Scalar 和 Vector。在每个派生类中,我都有一个成员函数,它以函数指针作为输入:

在标量类中:

在向量类中:

请注意不同的返回类型:doublestd::vector<double>. 我想在相互基类 Parameter 中定义这个函数——所以我更改了要使用的函数(void* input),然后在 Scalar 和 Vector 类中定义函数时尝试了以下操作:

samplerType inputSampler = dynamic_cast< samplerType >(input);

但是,我在 VS 2005 中收到以下错误:

Grumble Grumble Grumble... 我不确定这是否有效(标准允许)C++,但我想无论哪种方式我都会将其视为我设计中的缺陷。

所以,我的标准方法是使用函数的返回类型对基类进行模板化,但我不能。根据设计,基类 Parameter 必须不含所有类型信息。 是否有不同的方式来设计继承?

我对谷歌的尝试在函数指针上几乎没有出现——因此我相信这实际上是无效的语法,但也许只是一个非常非常不常见的设计挑战?这是另一个地方,救援的函子吗?

0 投票
2 回答
2458 浏览

c++ - 动态转换抛出指针不是 std::__non_rtti_object

我在使用 dynamic_cast 时遇到问题。我刚刚编译了我的项目并在调试模式下测试了所有东西,然后我尝试在发布模式下编译它,我已经从调试模式 exept 优化参数复制了每个配置,现在是 /o2,(在调试时我将它设置为 /od)项目已编译,但是当它开始加载我的资源时,我在此处的代码段中遇到异常:

代码中没有任何变化,当我签入调试器时,类中的每个变量都是应该的,但是动态转换正在抛出 std::__non_rtti_object。我做错了什么?而且我正在使用 cocos2d-x ,我没有足够的声誉来添加该标签!

0 投票
1 回答
2356 浏览

c++ - dynamic_cast 问题:typeid 对象不相等,但 name 相等

我发现这dynamic_cast在我期望的情况下不起作用,并且typeid在运行时查看对象使情况变得更加不清楚。我只想要从基础到派生的演员表,我不知道为什么它不起作用。

我有一个类似这样的类结构:

我(基本上)有一个std::vector<BoundaryCondition*>代表问题部分边界条件的 a 。我希望能够接受它,vector并且对于其中的所有MarshakBc对象,调用changeValueLaterOn. 所以我有一个看起来像的循环

如果我的向量包含 a ReflectingBc*,那么 a MarshakBc*,我的输出如下所示:

我对dynamic_castand有什么误解typeid吗?

[实际情况比这复杂,因为定义和BoundaryCondition上面的代码在不同的翻译单元,涉及到模板等,但是上面的代码很能代表我正在做的事情和我正在做的结果得到。]


更多细节

这是我的实际例程,它在仿函数内部使用,LoAnisoBc是派生类,BoundaryConditionT也是基类:

这是输出


所以bcPtrs_结构和边界条件在一个动态库中(所以它是Python中的一个模块),而实例化FillLoAnisoBcs在另一个动态库中。Erik 认为这是可能的问题,我同意。

0 投票
2 回答
4336 浏览

c++ - C++:比较基类和派生类的指针

在这种情况下比较指针时,我想了解一些有关最佳实践的信息: