具有相同地址的指针相等性测试产生错误
pointer equality test with same address yields false
为什么这个指针比较不起作用?
// 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
的子类。由于不知道哪个模板实例化触发了slot,所以这里不能做动态转换,直接比较同类型的指针。
我也尝试使用 reinterpret_cast<uintptr_t>
比较指针地址,但是当我这样做时很奇怪,它们产生了不同的整数。
我能够通过向信号和槽添加参数使其通过 const SimpleBase *
即 this
来解决该问题,指针比较就是这样工作的。但我很好奇是否有一种方法可以按原样比较这些指针,使用 sender()
而不是传递额外的参数?
看来您可以 dynamic_cast<SimpleType*>(sender())
或 dynamic_cast<QObject*>(m_expected)
假设两者都是唯一的并且具有 virtual
功能。多重继承的基确实有不同的实际地址,你不能总是使用 void*
来比较它们是否相等。
为什么这个指针比较不起作用?
// 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
的子类。由于不知道哪个模板实例化触发了slot,所以这里不能做动态转换,直接比较同类型的指针。
我也尝试使用 reinterpret_cast<uintptr_t>
比较指针地址,但是当我这样做时很奇怪,它们产生了不同的整数。
我能够通过向信号和槽添加参数使其通过 const SimpleBase *
即 this
来解决该问题,指针比较就是这样工作的。但我很好奇是否有一种方法可以按原样比较这些指针,使用 sender()
而不是传递额外的参数?
看来您可以 dynamic_cast<SimpleType*>(sender())
或 dynamic_cast<QObject*>(m_expected)
假设两者都是唯一的并且具有 virtual
功能。多重继承的基确实有不同的实际地址,你不能总是使用 void*
来比较它们是否相等。