在RAII中,资源只有在被访问后才被初始化。但是,许多访问方法都声明为常量。我需要调用mutable(非const)函数来初始化数据成员。

示例:从数据库加载

struct MyClass
{
  int get_value(void) const;

  private:
     void  load_from_database(void); // Loads the data member from database.

     int m_value;
};

int
MyClass ::
get_value(void) const
{
  static bool value_initialized(false);
  if (!value_initialized)
  {
    // The compiler complains about this call because
    // the method is non-const and called from a const
    // method.
    load_from_database();
  }
  return m_value;
}

我的原始解决方案是将数据成员声明为mutable。我宁愿不这样做,因为它表明其他方法可以更改成员。

我该如何转换load_from_database()语句来摆脱编译器错误?

最佳答案

这不是RAII。在RAII中,您可以在构造函数中对其进行初始化,从而解决您的问题。

因此,您在这里使用的是Lazy。无论是延迟初始化还是延迟计算。

如果您不使用mutable,那么您将遭受很大的伤害。

当然,您可以使用const_cast,但是如果有人这样做:

static const MyClass Examplar;

并且编译器确定它是只读存储器的良好候选者?好吧,在这种情况下,const_cast的效果是不确定的。充其量,什么也没有发生。

如果您仍然希望遵循const_cast路线,请像R Samuel Klatchko一样进行。

如果您考虑过并认为可能有更好的选择,则可以决定包装变量。如果它是自己的类,并且仅使用3种方法:getsetload_from_database,那么您不必担心它是mutable

09-25 22:16