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_;
};
我可以吃蛋糕吗?
Jam*_*ran 23
这很好,是这种做法的典型方式.
你必须声明expensive_object_为mutable
mutable QObject *expensive_object_; 
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;
   }
};
现在在代码中使用它,如下所示:
class MyClass {
  MyClass() : expensive_object_(CreateExpensiveObject) {}
  QObject* GetExpensiveObject() const {
    return expensive_object_.get();
  }
private:
  suspension<QObject *> expensive_object_;
};
const_cast在那个特定的地方使用to side-step const 。
QObject* GetExpensiveObject() const {
  if (!expensive_object_) {
    const_cast<QObject *>(expensive_object_) = CreateExpensiveObject();
  }
  return expensive_object_;
}
恕我直言,这比制作更好,expensive_object_ mutable因为您不会在所有其他方法中失去 const 安全性。
| 归档时间: | 
 | 
| 查看次数: | 9500 次 | 
| 最近记录: |