3

我有一个这样的 C++ 类:

class Example {

    public:

        int getSomeProperty(int id) const;

    private:

        lazilyLoadSomeData();

}

基本上getSomeProperty()返回一些已经使用加载的数据lazilyLoadSomeData()。由于我不想在需要之前加载此数据,因此我在其中调用此方法getSomeProperty()

int Example::getSomeProperty(int id) const {
    lazilyLoadSomeData(); // Now the data is loaded
    return loadedData[id];
}

这不起作用,因为 lazilyLoadSomeData() 不是 const。即使它只更改可变数据成员,编译器也不会允许它。我能想到的唯一两个解决方案是:

  • 在类构造函数中加载数据,但我不想这样做,因为延迟加载所有内容会使应用程序更快。

  • 使lazilyLoadSomeData()常量。它会起作用,因为它只更改可变成员,但它似乎并不正确,因为从名称来看,该方法显然正在加载某些内容并且显然正在进行一些更改。

关于什么是处理这个问题的正确方法的任何建议,而不必欺骗编译器(或完全放弃 const 正确性)?

4

3 回答 3

4

您可以创建一个您声明mutable并封装延迟加载策略的代理成员对象。该代理本身可以从您的const函数中使用。作为奖励,您最终可能会得到一些可重用的代码。

于 2011-12-17T13:59:56.987 回答
3

我会将调用转发到作为mutable此类成员的代理对象,如下所示:

class Example {

    public:

        int getSomeProperty(int id) const
        {
            m_proxy.LazyLoad();
            return m_proxy.getProperty(id);
        }

    private:

        struct LazilyLoadableData
        {
             int GetProperty(int id) const;
             void LazyLoad();
       };

     mutable LazilyLoadableData m_proxy;
};
于 2011-12-17T14:05:41.890 回答
1

将 lazilyLoadSomeData() 设为常量。它会起作用,因为它只更改可变成员,但它似乎并不正确,因为从名称来看,该方法显然正在加载某些内容并且显然正在进行一些更改。

不,它没有做一些改变,至少从调用 getSomeProperty 的人的角度来看是这样。如果你做对了,所有的变化都是纯粹的内部变化,从外部看不到。这是我会选择的解决方案。

于 2011-12-17T14:04:38.553 回答