2014-09-29 35 views
1

類靜態方法我有一個基類Vehicle和欲填充的Runnable亞類(MotorcycleCarAirplane),使得我可以通過在地圖上進行迭代,並調用靜態方法Motorcycle::run()Car::run()一個std::unordered_mapAirplane::run()。如何填充std::unordered_mapC++存儲在unordered_map

+0

你在做這個而不是使用多態性的原因是什麼?可能有一個更容易/更好的方式來做你想做的事情。 – Velox 2014-09-29 20:52:44

+0

是的,指定你想要做什麼可能確實有助於找到更好的解決方案。 – Svalorzen 2014-09-29 20:54:08

+0

從給出的信息幾乎可以保證有一個設計問題,一方面你有一個類的實例,另一方面你有靜態函數,你希望能夠調用,從而放棄對象關係。 – Ylisar 2014-09-29 20:55:54

回答

1

有兩種方法。

難的方法:

靜態函數不是虛擬的,你必須存儲的MororcyleCarAirplaneboost::variant

typedef boost::variant< Motorcycle, Car, Airplane > VRunnable; // variant 
unordered_map<key_t, VRunnable> m; 

當你遍歷你unorderd_map,你便可以識別物體的類型,並調用正確類型的靜態成員。您可以通過使用訪問者類來完成此操作,該類定義了變體中操作超載的操作類型。

它可以工作,但考慮到你想要做什麼,它更加繁瑣。實際上,在這裏你並沒有採用Runnable繼承和多態。

聰明的辦法:

更簡單的方法是將有一個虛擬成員的Runnable :: V運行()調用每一個Runnable的子類的approporiate靜態的run()。然後,您可以簡單地遍歷您的無序映射,然後調用虛函數:然後該對象將調用正確的靜態成員。

unordered_map<key_t, Runnable> m; 
for (auto x: m) 
    f.second.vrun(); 
0

在C++中,不能多態地調用靜態方法。但是,您可以調用常規方法並調用靜態方法

struct Runnable 
{ 
    virtual void run_me() = 0; 
}; 

class Car : public Runnable 
{ 
public: 
    virtual void run_me() { run(); } 
    static void run(); 
};