2011-04-13 66 views
1

我有一家工廠,有不相關的東西工作的商店。一些商店工作或個人汽車和從那裏派生的班級(汽車,SUV,輕便摩托車)和其他工作的軍車和從那裏派生的班級(坦克,飛機,潛艇)。我可以告訴std :: type_info對象是否等於另一個或從另一個派生的類?

這個問題涉及到我的工廠類,它不關心在商店做什麼,但它提供了一些服務,以確保正確的車輛類型被路由到正確的商店。即如果奧迪A4在裝卸碼頭出現,則需要將其識別爲個人汽車並且發送到個人汽車商店。

我可以在沒有在Factory類中聲明車輛類型的情況下做到這一點嗎?

所以,在更多的C++代碼信息,我想我廠可以有一個std::map<shop *, const std::type_info *>容器,其中在std::type_info *由商店提供,並指向基類車輛(例如,個人汽車或軍用車輛)的。 但是......我一直無法找出一種方法來檢查一個對象的一個​​std::type_info是否與從該候選者派生的候選對象相同。

如果工廠至少知道基本車輛類型(個人汽車和軍用車輛),我知道如何使用dynamic_cast<>()作用於個人自動指針或軍用車輛指針來檢查類型是否相等或者是否派生從基地。但是,我希望儘可能地使工廠儘可能通用。

任何想法?

回答

1

爲什麼不讓商店告訴他們是誰? 像

virtual bool CanBeShipped() const = 0; 
virtual bool IsMilitary() const = 0; 

使工廠只有它需要實現規則的知識創建基於規則,每家店必須實現一個接口,與方法。

+0

這將要求每個商店在某種程度上意識到所有商店所做的所有不同類型的東西。即IsMilitary(),如你所建議的那樣,要求個人汽車商店知道其他商店生產軍事材料。 – NoahR 2011-11-17 23:59:10

0

在這一點上,我認爲我想要的std :: type_info對象的操作類型是不可能的。

我認爲下一個最佳選擇是將識別責任推到商店。 商店維護一個特定產品的表格和他們的類型識別。例如

std::list<const std::type_info *> productsMadeHere; 

商店還提供了一個通用接口,工廠可以用它來輪詢店鋪,如果它接受特定類型。

Shop::isThisMadeHere(std::type_info * product_type); 
相關問題