【发布时间】:2010-12-22 08:46:02
【问题描述】:
我需要将包含地址的整数类型转换为实际的指针类型。我可以使用 reinterpret_cast 如下:
MyClass *mc1 = reinterpret_cast<MyClass*>(the_integer);
但是,这不会执行任何运行时检查以查看相关地址是否实际包含 MyClass 对象。我想知道首先转换为 void*(使用 reinterpret_cast)然后在结果上使用 dynamic_cast 是否有任何好处。像这样:
void *p = reinterpret_cast<void*>(the_integer);
MyClass *mc1 = dynamic_cast<MyClass*>(p);
assert(mc1 != NULL);
使用第二种方法有什么好处吗?
【问题讨论】:
-
第二种方法是不合法的C++,dynamic_cast的表达式类型可能不是void*。
-
假设整数值最初是指向对象的指针。那么 int 可能无法保存指针。这就是为什么我们有 void*。如果您要为跨无类型边界的传输转换指针,则应将它们转换为 void* 并返回原始类型。
-
他没有具体说'int',类型可能是intptr_t。
-
@Roger:如果是这样的话,它会起作用。但值得指出的是,使用 void* 是明智的,因为它就是为此而设计的。
-
那么...如何将指针移过“无类型边界”?就我而言,我收到一条 Win32 消息,需要将 GetWindowLong 调用的结果转换为指针。最安全的方法是什么?
标签: c++ casting dynamic-cast reinterpret-cast