1

我正在调试一些代码。执行到了这个方法:

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,所以比较应该只是相同类型的指针。事实上,调试器为两个指针显示相同的值。

我不知道是问题所在。非常感谢任何帮助。谢谢

塞西里奥·萨尔梅隆

4

2 回答 2

1

两个变量,observedTarget 和 target,具有相同的值,但布尔 fNotify 为假!

您可能想通过添加打印语句来检查代码:

printf("%p == %p is %d\n", observedTarget, target, int(fNotify));

涉及的“目标”对象使用多重继承,“可观察”是父对象之一。

Observable如果对象可能不止一次派生,那么您可能希望比较完整派生对象的地址。dynamic_cast<void*>(ptr)返回由 引用的完整派生对象的地址ptr,因此:

bool fNotify = dynamic_cast<void*>(observedTarget) == dynamic_cast<void*>(target);
于 2013-01-15T23:04:05.173 回答
0

如果在转换指针时使用了错误的类型转换,无论是在函数参数中还是在 的返回值中target(),都可能会得到一个损坏的指针。dynamic_cast是最好的,也static_cast应该是安全的。reinterpret_cast可能会导致问题,并且旧的 C 样式转换可能reinterpret_cast取决于它的使用方式。如果您没有使用显式强制转换,那也应该没问题,自动转换将始终是安全的。

当您第一次发现将指针转换为继承树中的不同类型可以更改指针值时,您会感到惊讶。

于 2013-01-15T23:25:22.573 回答