В 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()
, чтобы избавиться от ошибок компилятора?
static bool value_initialized(false);
не только напоминает «самый неприятный синтаксический анализ», но и используется всеми экземплярами MyClass. Это желательно? - person mlvljr   schedule 19.03.2010main()
из-за квалификатораstatic
. Таким образом, это хороший флаг для инициализации. Все экземпляры будут использовать его косвенно, поскольку он указывает, было ли инициализировано значение. - person Thomas Matthews   schedule 19.03.2010