【问题标题】:pointer equality test with same address yields false [closed]具有相同地址的指针相等测试产生错误 [关闭]
【发布时间】:2021-04-01 14:26:16
【问题描述】:

为什么这个指针比较不起作用?

// in handleSlot()...
void* ptr1 = m_expected; // defined as SimpleBase*
void* ptr2 = sender(); // defined as QObject*
if (ptr1 != ptr2)
    return; // this should not be reached, since the debugger shows ptr1 and ptr2 are the same

这里的背景是我有一个模板类型,它继承自QObjectT,其中TSimpleBase 的子类。由于不知道是哪个模板实例化触发了槽,所以这里不能做动态转换直接比较同类型的指针。

我还尝试使用reinterpret_cast<uintptr_t> 比较指针地址,但是当我这样做的时候很奇怪,它们产生了不同的整数。

我能够通过向信号和槽添加一个参数来解决该问题,以便它通过const SimpleBase *,即this,并且指针比较以这种方式工作。但我很好奇是否有办法比较这些指针,使用sender() 而不是传递额外的参数?

【问题讨论】:

  • 请提供完整的minimal reproducible example,以便我们运行并重现您的问题。据我们所知,这实际上可能不是导致您认为的行为的问题代码。
  • FWIW,类的QObject部分和类的SimpleBase部分将有不同的地址,即使指向同一个对象。
  • 这是相关的:stackoverflow.com/a/42504012/8593689。简而言之,@NathanOliver 所说的是正确的,我链接的答案详细说明了为什么会这样。
  • 看来你可以dynamic_cast<SimpleType*>(sender())dynamic_cast<QObject*>(m_expected) 假设两者都是唯一的并且有virtual 功能。多重继承的碱基确实有不同的实际地址,您无法始终使用void* 比较它们是否相等。
  • @DietmarKühl - 这就是答案。我没有想到我可以在两个不直接相关的声明类型之间进行动态转换。但我猜运行时信息允许这种情况发生。随时写出来作为答案,我会给你信用

标签: c++ qt c++14 visual-studio-2019 void-pointers


【解决方案1】:

您似乎可以dynamic_cast<SimpleType*>(sender())dynamic_cast<QObject*>(m_expected) 假设两者都是唯一的并且具有virtual 功能。多重继承的基确实具有不同的实际地址,您无法始终使用void* 比较它们是否相等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多