我正在调试一些代码。执行已经到了这个方法:
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);
...
上一段摘录的最后一句已经执行。两个变量observeTarget和target都具有相同的值,但boolean fNotify为false!涉及的“目标”对象使用多重继承,“Observable”是父项之一。但是所有东西都被转换为Observable,因此比较应该只是相同类型的指针。实际上,调试器为两个指针显示相同的值。
我不知道问题是什么。任何帮助都非常感谢。谢谢
Cecilio Salmeron
答案 0 :(得分:1)
observeTarget和target这两个变量具有相同的值,但boolean fNotify为false!
您可以通过添加print语句来检查代码:
printf("%p == %p is %d\n", observedTarget, target, int(fNotify));
涉及的'target'对象使用多重继承,'Observable'是父节点之一。
如果对象可能不止一次派生自Observable
,那么您可能希望比较完整派生对象的地址。 dynamic_cast<void*>(ptr)
返回ptr
引用的完整派生对象的地址,因此:
bool fNotify = dynamic_cast<void*>(observedTarget) == dynamic_cast<void*>(target);
答案 1 :(得分:0)
如果在转换指针时使用了错误类型的强制转换,无论是在函数参数还是target()
的返回值中,都可能会出现损坏的指针。 dynamic_cast
是最好的,static_cast
也应该是安全的。 reinterpret_cast
可能会导致问题,旧的C风格演员可能是reinterpret_cast
,具体取决于它的使用方式。如果您没有使用显式强制转换,那么也应该没问题,自动转换将始终是安全的。
当您第一次发现在继承树中投射指向其他类型的指针可以更改指针值时,这是令人惊讶的。