Dav*_*eer 30 c++ lazy-loading const
为延迟初始化的成员变量实现getter方法并保持const正确性的正确方法是什么?也就是说,我想让我的getter方法成为const,因为在第一次使用它之后,它是一个普通的getter方法.这是第一次(首次初始化对象时)const不适用.我想做什么:
class MyClass {
MyClass() : expensive_object_(NULL) {}
QObject* GetExpensiveObject() const {
if (!expensive_object_) {
expensive_object = CreateExpensiveObject();
}
return expensive_object_;
}
private:
QObject *expensive_object_;
};
Run Code Online (Sandbox Code Playgroud)
我可以吃蛋糕吗?
Jam*_*ran 23
这很好,是这种做法的典型方式.
你必须声明expensive_object_
为mutable
mutable QObject *expensive_object_;
Run Code Online (Sandbox Code Playgroud)
mutable
基本上意味着"我知道我在const对象中,但修改它不会破坏常量."
Ken*_*oom 19
如果经常这样做,我建议将James Curran的答案封装成自己的类:
template <typename T>
class suspension{
std::tr1::function<T()> initializer;
mutable T value;
mutable bool initialized;
public:
suspension(std::tr1::function<T()> init):
initializer(init),initialized(false){}
operator T const &() const{
return get();
}
T const & get() const{
if (!initialized){
value=initializer();
initialized=true;
}
return value;
}
};
Run Code Online (Sandbox Code Playgroud)
现在在代码中使用它,如下所示:
class MyClass {
MyClass() : expensive_object_(CreateExpensiveObject) {}
QObject* GetExpensiveObject() const {
return expensive_object_.get();
}
private:
suspension<QObject *> expensive_object_;
};
Run Code Online (Sandbox Code Playgroud)
const_cast
在那个特定的地方使用to side-step const 。
QObject* GetExpensiveObject() const {
if (!expensive_object_) {
const_cast<QObject *>(expensive_object_) = CreateExpensiveObject();
}
return expensive_object_;
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,这比制作更好,expensive_object_
mutable
因为您不会在所有其他方法中失去 const 安全性。