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 は false です! 関連する「ターゲット」オブジェクトは多重継承を使用しており、「監視可能」は親の 1 つです。ただし、すべてが Observable にキャストされるため、比較は同じ型のポインターにすぎません。実際、デバッガーは両方のポインターに対して同じ値を示します。

問題があったかどうかはわかりません。どんな助けでも大歓迎です。ありがとうございました

セシリオ・サルメロン

4

2 に答える 2

1

両方の変数、observedTarget と target は同じ値を持ちますが、ブール値の fNotify は false です!

print ステートメントを追加して、コードを確認することもできます。

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

関連する「ターゲット」オブジェクトは多重継承を使用しており、「監視可能」は親の 1 つです。

オブジェクトが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 に答える