具有延迟初始化的C ++ const getter方法
收藏

为延迟初始化的成员变量实现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_;
};

我可以吃蛋糕吗?

最佳答案

如果您经常这样做,我建议将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_;
};

    公众号
    关注公众号订阅更多技术干货!