c++ - 为什么在定义 Q_DECLARE_PRIVATE 宏时在实现 d_fun() 中使用reinterpret_cast

标签 c++ qt

Qt 类在公共(public)类中有一个 Q_DECLARE_PRIVATE 宏。宏内容如下:

#define Q_DECLARE_PRIVATE(Class)\
    inline Class##Private* d_func() {\
        return reinterpret_cast<Class##Private*>(qGetPtrHelper(d_ptr));\
    }\
    inline const Class##Private d_func() const {\
        return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr));\
    }\
    friend class Class##Private;

这里,根据我的理解 Class##Private 将是 d_ptr 类的父级,那么为什么使用 reinterpret_cast 而不是 dynamic_cast

最佳答案

原因是:

  1. A dynamic_cast Qt 源代码不支持,因为可以在关闭 RTTI 的情况下构建 Qt。

    dynamic_cast<字符串出现在非测试、非第三方 Qt 5.7.0 源代码中的大约十几个位置,其中大多数本质上是错误/遗漏。

  2. 该宏用于 Class##Private 的 header 中是前向定义的。一个static_cast不会工作,因为编译器不知道 Class##Private派生自 d_ptr 的指向类型.

  3. 如果 Class##Private不是前向定义的,那么要使用的正确转换将是 static_cast 。一个dynamic_cast这将是一个过早的悲观,因为该宏用在 d_ptr 的地方。的指向类型在编译时是已知的,尽管不在 header 中。

有关Q_DECLARE_PRIVATE的更多详细信息,另见How to use the Qt's PIMPL idiom? .

关于c++ - 为什么在定义 Q_DECLARE_PRIVATE 宏时在实现 d_fun() 中使用reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514481/

相关文章:

c++ - MSVC 编译器更新

c++ - 将 unicode 替换为 C++ 字符串中的空格时出现段错误

c++ - 为什么 C++ 中 bool 和指针的这种奇怪的兼容性?

c++ - 从任务栏取消分组单独的进程

python - 如何根据文本输入过滤 PyQt QCombobox 项目?

qt - QDockWidget::title(需要更改字体和大小)

c++ - 自从在 C++ 中执行以来耗时的最干净和最简单的方法

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

css - 如何修复/解决 QtWebKit 不正确的字体回退行为?

c++ - 从 QMap 获取最后插入/添加的项目