2013-08-18 34 views
0

我在控制器類中有std::map<int, std::shared_ptr<base>> m_items。僅使用基本指針的std :: map的派生類型的迭代

控制器向外部消費者提供項目,他們只需要基礎,因此多態性對此非常有用。但是,內部控制器需要在發生特定事件時更新或刪除特定類型的項目。更新本質上是非常不同的,並且每個事件都需要不同的數據集,所以我不能只在基類中有一個通用的「更新」方法。我需要的是一種只在某些派生類型(當然我需要轉換爲派生類型指針)發生事件時迭代的方法。一種解決方案是在基數中添加一個EDerivedType GetType(),每個派生類型返回一個不同的枚舉值,所以當我迭代時,我可以比較所需的類型。雖然這起作用,但它不是面向對象的方法。

任何人都可以提出一個更優雅的方式來做到這一點?

謝謝...

回答

1

我認爲Visitor設計模式,可以爲你工作。 您的基類將有一個抽象accept,它將訪問者作爲參數。

每個對象都有一個accept,它將調用正確的訪問者函數來執行更新。

+0

由於操作有很大不同,所以不起作用。每種類型在控制器方面都有很大的不同。所有派生類型唯一的相互作用是它們可以被繪製,但每個都是我的應用程序的邏輯部分,代表不同的數據集。 – sprite

+0

@sprite - 在訪問者的'visit'函數中,你得到對象本身並編寫對象特定的代碼。我不明白具體對象彼此有很大不同的事實會有什麼不同。 – asafrob

+0

好的,我想我以前誤解了你。所以如果我正確地得到你的意圖,訪問者將是一個代表事件和相關數據的類。對於VisitorBase類中的每個派生類型,我需要一個Visit(Derived&),並使用默認實現不執行任何操作。然後,我會從每個操作繼承那個類,在那裏我只重載Visit所需的派生類型以執行所需的操作。它是否正確? – sprite

0

我想你已經逮住的想法:「我需要的是隻對某些派生類型(我這時就需要轉換爲派生類型的指針)在事件發生時要迭代的方式」

你可能保留std::map< EDerivedType, Controlloer *>並直接找到相應的控制器。另外,Controller應該是一個多態基類。

+0

我不能有很多控制器。我需要一個控制器來處理所有的邏輯。所以擁有無數的控制器類別是不可能的。如果我爲每種類型使用地圖,它可能會起作用,但我最終會得到大約20張地圖,這將是一個混亂的代碼。我希望它只在一個集合中的所有對象之外的派生類型上進行迭代,作爲指向base的指針。 – sprite