草庐IT

c++ - dynamic_cast的实际使用?

我有一个关于dynamic_cast运算符的非常简单的问题。我知道这用于运行时类型识别,即在运行时了解对象类型。但是根据您的编程经验,您能否给出一个必须使用此运算符的真实场景?不使用有什么困难? 最佳答案 玩具示例诺亚方舟应作为不同类型动物的容器。由于方舟本身并不关心猴子、企鹅和蚊子之间的区别,所以你定义了一个类Animal,派生类Monkey,Penguin,和Mosquito从它,并将它们中的每一个存储为Animal在方舟里。一旦洪水结束,诺亚想将动物分布在地球上它们所属的地方,因此需要更多关于储存在他方舟中的通用动物的知识。例

c++ - char* 和 std::uint8_t* 之间的 reinterpret_cast - 安全吗?

现在我们有时都必须使用二进制数据。在C++中,我们使用字节序列,并且从一开始char是我们的基石。定义为sizeof1,它是字节。并且所有库I/O函数都使用char默认。一切都很好,但总有一点问题,一些奇怪的问题困扰了一些人-一个字节中的位数是实现定义的。所以在C99中,决定引入几个typedef来让开发人员轻松表达自己,固定宽度的整数类型。当然是可选的,因为我们不想损害可移植性。其中,uint8_t,作为std::uint8_t迁移到C++11,一个固定宽度的8位无符号整数类型,对于真正想要使用8位字节的人来说是完美的选择。因此,开发人员接受了新工具并开始构建明确声明他们接受8位字节

c++ - 错误 : cast from 'void*' to 'int' loses precision

我有一个带有原型(prototype)void*myFcn(void*arg)的函数,它用作pthread的起点。我需要将参数转换为int以供以后使用:intx=(int)arg;编译器(GCC版本4.2.4)返回错误:file.cpp:233:error:castfrom'void*'to'int'losesprecision转换这个的正确方法是什么? 最佳答案 您可以将其转换为intptr_t类型。这是一个int类型保证足够大以包含指针。使用#include来定义它。 关于c++-错

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

出于检查空指针的习惯,我有时会写:MyClass*c=someBasePtr?dynamic_cast(someBasePtr):0;if(c){...实际上,在传递给动态转换之前检查空指针,并检查返回。然后我阅读了MSDN文档Anullpointervalueisconvertedtothenullpointervalueofthedestinationtypebydynamic_cast.看来我可以安全地删除?:构造。这是C++便携吗?这样新的代码会是MyClass*c=dynamic_cast(someBasePtr);if(c){...当然假设someBasePtr为null或

c++ - 尝试使用 dynamic_cast 时出现 "source type is not polymorphic"

structA{};structB:A{};intmain(){A*a=newB();B*b=dynamic_cast(a);}给予:cannotdynamic_cast'a'(oftype'structA*')totype'structB*'(sourcetypeisnotpolymorphic)如何使A具有多态性?我想安全地将其转换到B。(一种方法是添加一个dummy虚函数,但有更好的方法吗?) 最佳答案 您需要使A具有多态性,可以通过添加virtual析构函数或任何虚函数来实现:structA{virtual~A()=defa

c++ - 为什么这个 reinterpret_cast 不编译?

我知道reinterpret_cast是危险的,我这样做只是为了测试它。我有以下代码:intx=0;doubley=reinterpret_cast(x);当我尝试编译程序时,它给了我一个错误提示invalidcastfromtype'float'totype'double发生了什么事?我认为reinterpret_cast是你可以用来将苹果转换为潜艇的流氓Actor,为什么这个简单的Actor不能编译? 最佳答案 在C++中,reinterpret_cast只能执行一组特定的转换,在语言规范中明确列出。简而言之,reinterpr

javascript - cast_sender.js 错误:无法加载资源:Chrome 中的 net::ERR_FAILED

我最近开始收到以下控制台错误,但没有进行任何代码更改。我最近没有安装任何扩展。Failedtoloadresource:net::ERR_FAILEDchrome-extension://enhhojjnijigcajfphajepfemndkmdlo/cast_sender.jsFailedtoloadresource:net::ERR_FAILEDchrome-extension://hfaagokkkhdbgiakmmlclaapfelnkoah/cast_sender.jsFailedtoloadresource:net::ERR_FAILEDchrome-extension:

Java Class.cast() 与强制转换运算符

在我的C++时代,我被教导C风格转换运算符的弊端,起初我很高兴发现在Java5中java.lang.Class获得了cast方法。我认为我们终于有了一种面向对象的方式来处理强制转换。原来Class.cast与C++中的static_cast不同。它更像是reinterpret_cast。它不会在预期的地方产生编译错误,而是会推迟到运行时。这是一个简单的测试用例来演示不同的行为。packagetest;importstaticorg.junit.Assert.assertTrue;importorg.junit.Test;publicclassTestCast{staticfinalcl

Java 泛型 : Cannot cast List<SubClass> to List<SuperClass>?

这个问题在这里已经有了答案:IsListasubclassofList?WhyareJavagenericsnotimplicitlypolymorphic?(19个回答)关闭6年前.刚刚遇到这个问题:Lista1=newArrayList();Listb1=a1;//compileerror:incompatibletypeDataNode类型是Tree的子类型。publicclassDataNodeimplementsTree令我惊讶的是,这适用于数组:DataNode[]a2=newDataNode[0];Tree[]b2=a2;//thisisokay这有点奇怪。任何人都可以对

c++ dynamic_cast 错误处理

是否有任何与dynamic_cast错误处理相关的良好做法(除非在不必要时不使用它)?我想知道我应该如何处理它可以抛出的NULL和bad_cast。我应该检查两者吗?如果我捕捉到bad_cast或检测到NULL,我可能无论如何都无法恢复......现在,我使用assert来检查dynamic_cast是否返回非NULL值。你会在代码审查时接受这个解决方案吗? 最佳答案 如果dynamic_cast应该成功,最好使用boost::polymorphic_downcast代替,这有点像这样:assert(dynamic_cast(o)=