2013-03-17 26 views
-2
class FunctionBase { 
    public: 
    const double operator() (double a_) const = 0; 
} 

class AddN : public FunctionBase { 
    public: 
    AddN (int n_) : FunctionBase(), _n(n_) {} 
    const double operator() (double a_) const { return (a_ + n); } 
    private: 
    int _n; 
} 

是否必須使用FunctionBase *作爲佔位符,因爲編譯器沒有能力從一個FunctionBase重構AddN的,或者是有使用FunctionBase &的方法嗎?C++通用使用的父類(引用或指針)

- 編輯 -

我有一個std::map<std::string, FunctionBase *>,我很好奇,如果我能夠使用一個參考,而不是一個指針,所以我可以保證指針不爲NULL之前,我使用它。我試圖讓代碼更具抗錯性。如果我將它切換到FunctionBase &,編譯器會抱怨它不能從FunctionBase &實例化AddN,這是完全合理的,但是我希望有一個我不知道的常用解決方法。

+0

你能詳細說明你在努力實現一點點改善嗎? 「使用類作爲佔位符」是什麼意思? – Shoe 2013-03-17 21:28:11

+0

這不太清楚你的意思。佔位符是什麼?你能說明你打算如何使用這些課程嗎?你面臨的具體障礙是什麼? – 2013-03-17 21:28:32

+0

@Jueecy請你回顧一下我的問題,我已經編輯它使其更加清晰。基本上我需要語法技巧或任何替代品。 – Zak 2013-03-17 22:09:39

回答

1

而不是定義類層次建議使用std::functionboost::function。這些可以容納一個可調用的,並且可以存儲在map的值,保證函數對象的生命週期:

std::map<std::string, std::function<double(double)>> functions; 

這省去了使用類層次結構,不需要添加到地圖的功能相關無論如何,這是更靈活的。

只需指出,使用引用而不是指針並不能保證被引用的對象仍然存在。懸掛引用是可能的,就像懸掛指針一樣。

+0

+1這是一種非常棒的新技術,但我沒有C++ 11或可用於我的應用程序的提升。 – Zak 2013-03-18 00:04:32