我正在调试一些代码。此方法已执行:
void EventNotifier::notify_observers(SpEventInfo pEvent, Observable* target)
{
std::list<Observer*>::iterator it;
for (it = m_observers.begin(); it != m_observers.end(); ++it)
{
Observable* observedTarget = (*it)->target();
bool fNotify = (observedTarget == target);
...
上一段节选的最后一句已被执行。两个变量,observedTarget和target,有相同的值,但布尔fNotify是假的!所涉及的"目标"对象使用多重继承,而"可观察对象"是父对象之一。但是所有东西都被强制转换为Observable,所以比较应该只是相同类型的指针。实际上,调试器对两个指针显示相同的值。
我不知道问题出在哪里。非常感谢任何帮助。谢谢你Cecilio Salmeron
两个变量,observedTarget和target,有相同的值,但布尔fNotify是假的!
您可以通过添加print语句来检查代码:
printf("%p == %p is %dn", observedTarget, target, int(fNotify));
涉及的'target'对象使用多重继承,'Observable'是父对象之一。
如果对象可能不止一次从Observable
派生,那么您可能希望比较完整派生对象的地址。dynamic_cast<void*>(ptr)
返回ptr
引用的完整派生对象的地址,因此:
bool fNotify = dynamic_cast<void*>(observedTarget) == dynamic_cast<void*>(target);
如果在转换指针时使用了错误的类型强制转换,无论是在函数参数中还是在target()
的返回值中,都可能得到一个损坏的指针。dynamic_cast
是最好的,static_cast
应该也是安全的。reinterpret_cast
可能会导致问题,而旧的c风格强制转换可能是reinterpret_cast
,这取决于它的使用方式。如果您没有使用显式强制转换,那么也应该是可以的,自动转换将始终是安全的。
当您第一次发现将指针转换为继承树中的不同类型可以改变指针值时,您会感到惊讶。