【发布时间】: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
这里的背景是我有一个模板类型,它继承自QObject 和T,其中T 是SimpleBase 的子类。由于不知道是哪个模板实例化触发了槽,所以这里不能做动态转换直接比较同类型的指针。
我还尝试使用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