c++ - static_cast 一个 void* 指针可以吗

标签 c++ casting

例如提议map<int,void*>hold其中 void*总是存储来自 classA 的指针稍后通过 static_cast 将其投回是否安全?

classA* ptr = static_cast<classA*>( holditerator->second );

原因void*使用是因为hold是在某些不知道什么的 cpp 文件使用的 header 上定义的类的成员 classA是。我必须包括 classA 的标题这些 cpp 文件的定义由于许多原因而无法完成。

最佳答案

是的,static_cast 在那种情况下是可以的,并且是正确的使用方式。

不过,我不得不问您为什么不首先存储 classA* 指针。如果你想将派生类指针放入其中,那么注意,你需要将派生类指针向上转换(隐式或显式)到 classA* 之前 你把它们放到 map 上。

但即使您也将派生类指针放入映射中,基类指针就足够了,因为派生类指针可以隐式转换为基类指针。

The reason void* is used is because hold is member of a class define on a header used by some cpp files which don't know what classA is.

这可能是防止分层违规的正当理由。

I would have to include the header of classA definitions on these cpp files which can't be done by many reasons.

您的情况很可能没有必要。前向声明就足够了。如果 header 知道放入 map 的内容,但只是想避免包含额外的 header ,这就是要走的路。

关于c++ - static_cast 一个 void* 指针可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12120900/

相关文章:

arrays - 如何将元组的快速数组转换为 NSMutableArray?

c++ - std::swap 是否仍会通过在 C++0x 中包含算法来定义?

C++ STL 比较映射找不到(运算符==)

c++ - 使用 `for(auto& e : cont)` 安全吗? vector<bool> 有什么问题?

inheritance - 使用带有派生类型(F#)的参数的函数

c++ - 从 ‘const int*’ 到 ‘int*’ 的无效转换

c++ - 无法在 ubuntu 20.04 中安装 g++

c++ - 组合早期返回函数的最简单方法是什么?

c# - 如何从数组中转换对象

sql - RETURN QUERY-PostgreSQL 中的记录