为什么在类中需要const函数和非const?

时间:2014-09-13 10:45:07

标签: c++ const sfml

我正在学习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;
};

2 个答案:

答案 0 :(得分:1)

他们不一样。一个返回Resource &,另一个返回const Resource &

这样调用const对象的get()返回一个const引用,并且在非const对象上调用的get()返回一个非const引用。据推测,目的是允许调用者更新此类包装的资源,但仅限于非const对象。

答案 1 :(得分:1)

这样做是为了让你适当地“引导”常量。这两个函数为您提供了两个不同的东西:

  • 第一个函数说如果你有一个常量ResourceHolder,你可以从中获得一个Resource的常量引用
  • 第一个函数表示如果你有一个非常数ResourceHolder,你可以从中得到一个非常数Resource引用

这样可以在两个上下文中使用ResourceHolder,而不会破坏编译。

请注意,在不同的上下文中需要两个不同的实现时,拥有两个不同的常量可能很重要。例如,非const版本可以实现get-or-create语义,而const版本可以在资源丢失时抛出异常。