【发布时间】:2010-03-19 16:31:54
【问题描述】:
在RAII中,资源在被访问之前不会被初始化。但是,许多访问方法被声明为常量。我需要调用mutable(非常量)函数来初始化数据成员。
示例:从数据库加载
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() 语句以消除编译器错误?
【问题讨论】:
-
确保通知用户第一次调用 getXXX 函数可能需要一些时间......或者用户可能会在性能很重要的关键部分第一次调用该函数......
-
@Thomas Matthews,这是一个解释 RAII 实际是什么的链接en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
-
"在 RAII 中,资源在被访问之前不会被初始化。" RAII 代表“Resource acquisition Is Initialization”,所以你的第一个陈述是错误的。
-
static bool value_initialized(false);不仅让人想起“最令人头疼的解析”,而且在 MyClass 的所有实例之间共享>。这是需要的吗? -
RAII 真的是“使用 C++ 析构语义来管理资源”(UCDSTMR),见stackoverflow.com/questions/712639/…
标签: c++ lazy-evaluation const-correctness