2014-09-13 83 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版本可能会在资源丢失时引发异常。

相关问题