2012-07-18 21 views
1

繼承可以說我有3個不同的類別:設備,武器和工具。武器和工具繼承設備。我創建了一個武器或工具對象並將其添加到設備數組中。當我檢索對象時,如何編寫我的「IF」語句來檢查這個對象是否是武器或工具?如何檢查哪些類類型的對象,當它從一個類

感謝

+1

'polymorphism'是你的朋友 – triclosan 2012-07-18 18:23:49

回答

1

使用的dynamic_cast如下:

Equipment *pMyObj = ... //got it somewhere 

Weapon *pWeapon = dynamic_cast<Weapon *>(pMyObj); 

if(pWeapon != NULL){ 
//you have weapon 
} 
+1

一個方便的技巧是聲明,如果條件裏面的變量:'如果(Weapon * pWeapon = dynamic_cast​​(pMyObj)){/ *你有武器* /}' – bames53 2012-07-18 18:27:53

+0

你是對的。謝謝你的訣竅。 – 2012-07-18 18:29:05

0

你在談論RTTI(link),但是如果你在你的設備的基類保持一個「類型」的枚舉,那麼它可能會更好只要檢查一下,找出派生類型是什麼。然後,你可以dynamic_cast裝備對象,以正確的派生型。

0

如果(dynamic_cast的<武器*>(Equipment_ptr)!= NULL)//然後武器

0

相信typeid的是另一種選擇..

if (typeid(thing)==typeid(otherthing)){ 
    //... 
} 
0

我對dynamic_cast的好壞參半的感覺,雖然。

雖然它會工作,它可能不是,如果選擇的數量可以增長的最佳選擇。在這種情況下,我更喜歡「kind」-enumeration和一個虛擬的GetKind()方法。這允許枚舉一個不錯的開關()語句,並且大多數編譯器甚至應該能警告你,如果你忘記列出枚舉值之一。

由於您已經知道在案例中您正在處理的是什麼課程,因此您不需要再進行dynamic_cast,因此您不必再執行相同的檢查。

當然,請儘量保持switch()或if-else-cascades的有限性;看看爲什麼你需要檢查類,花一兩分鐘考慮將代碼置於一個虛擬的方法來代替。我不是說永遠不要測試類的類型,但我認爲至少應該使之成爲Concious酒店決定:-)

相關問題