2013-01-15 71 views
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); 
     ... 

上一個摘錄的最後一句已執行。 observerTarget和target兩個變量都具有相同的值,但boolean fNotify爲false!涉及的「目標」對象使用多重繼承,「可觀察」是父母之一。但是所有東西都被賦予了Observable,所以比較應該只是相同類型的指針。實際上,調試器對兩個指針都顯示相同的值。

我不知道是這個問題。任何幫助都非常感謝。謝謝

塞西Salmeron

+1

嘗試使用'dynamic_cast'。 – imreal

+0

你怎麼知道這個target和observedTarget是一樣的?你打印出來/在調試器中看着它們嗎?它們是指向相同還是實際指針的對象。前者並不意味着後者也成立。 –

+0

嘗試打印出他們的地址,如果他們不是相同的,那麼他們不是相同的分配對象。 –

回答

1

兩個變量,observedTarget和目標,具有相同的價值,但布爾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); 
+0

我發現了這個問題:在調用這個方法之前,C風格中有一個錯誤的轉換,而不是static_cast/dynamic_cast C++風格。解決這個問題就解決了。謝謝 – user1981632

0

如果您使用了錯誤的那種鑄當你轉換的指針,在函數參數或target()的返回值,你可以得到一個損壞的指針。 dynamic_cast是最好的,並且static_cast也應該是安全的。 reinterpret_cast可能會導致問題,並且根據使用方式的不同,舊的C風格演員陣列可能是reinterpret_cast。如果你沒有使用明確的演員陣容,那麼也應該可以,自動轉換總是安全的。

當您第一次發現在繼承樹中指向不同類型的指針可以更改指針值時,這是令人驚訝的。

+0

謝謝。你是對的。問題是在調用這個方法之前,C風格中有一個錯誤的轉換,而不是static_cast/dynamic_cast C++風格。解決這個問題就解決了。謝謝 – user1981632