2014-09-13 137 views
1

我正在學習SFML,並發現奇怪的是,在類資源持有者中存在兩個獲取函數。但他們實際上完全相同。爲什麼在一個類中需要const函數和非const?

我的問題是:爲什麼有兩個函數?

代碼是followes:

template <typename Resource, typename Identifier> 
class ResourceHolder 
{ 
    public: 
     void      load(Identifier id, const std::string& filename); 

     template <typename Parameter> 
     void      load(Identifier id, const std::string& filename, const Parameter& secondParam); 

     Resource&     get(Identifier id); 
     const Resource&    get(Identifier id) const; 


    private: 
     void      insertResource(Identifier id, std::unique_ptr<Resource> resource); 


    private: 
     std::map<Identifier, std::unique_ptr<Resource>> mResourceMap; 
}; 
+0

它類似於'std :: vector :: operator []'順便說一句。 – Hiura 2014-09-13 13:31:23

回答

1

他們是不一樣的。一個返回Resource &,另一個返回const Resource &

這使得在一個const對象上調用get()返回一個const引用,並且在非const對象上調用的get()返回一個非const引用。據推測,目的是允許調用者更新該類正在包裝的資源,但僅限於非const對象。

1

這樣做是爲了讓您適當地「引導」常量。這兩個功能給你兩個不同的東西:

  • 第一個函數說,如果你有一個恆定的ResourceHolder,你可以從它那裏得到
  • 恆定Resource引用第一個函數說,如果你有一個非恆ResourceHolder,你可以得到一個非常Resource參考從中

這可以讓你的ResourceHolder在兩種環境中使用,而不會破壞編譯。

請注意,在不同情況下需要兩種不同的實現時,有兩個不同的常量可能很重要。例如,非const版本可以實現獲取或創建語義,而const版本可能會在資源丟失時引發異常。

相關問題