我正在学习SFML,并且发现奇怪的是在类资源持有者中存在两个get函数。但它们实际上完全相同。
我的问题是:为什么有两个获取功能?
代码如下:
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 :(得分:1)
他们不一样。一个返回Resource &
,另一个返回const Resource &
。
这样调用const对象的get()
返回一个const引用,并且在非const对象上调用的get()
返回一个非const引用。据推测,目的是允许调用者更新此类包装的资源,但仅限于非const对象。
答案 1 :(得分:1)
这样做是为了让你适当地“引导”常量。这两个函数为您提供了两个不同的东西:
ResourceHolder
,你可以从中获得一个Resource
的常量引用ResourceHolder
,你可以从中得到一个非常数Resource
引用这样可以在两个上下文中使用ResourceHolder
,而不会破坏编译。
请注意,在不同的上下文中需要两个不同的实现时,拥有两个不同的常量可能很重要。例如,非const
版本可以实现get-or-create语义,而const
版本可以在资源丢失时抛出异常。