在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种方法:
get
,set
和load_from_database
,那么您不必担心它是mutable
。