【问题标题】:Static initialization with private constructor使用私有构造函数进行静态初始化
【发布时间】:2016-08-17 22:05:00
【问题描述】:

在一个类中,我有一个代表该类的单例实例的静态成员:

class A {
public:
  static const std::shared_ptr<A> INSTANCE;
private:
  A();
};

为了防止出现更多实例,我将构造函数设为私有。现在我无法初始化静态变量,因为初始化程序无法访问私有成员。这是我在 .cpp 文件中使用的代码:

const std::shared_ptr<A> A::INSTANCE = std::make_shared<A>();

工厂方法也无济于事,因为它也必须是公共的。我还能做些什么来完成这项工作?注意:如果可能,我想避免使用典型的 static get() 方法。

【问题讨论】:

    标签: c++


    【解决方案1】:

    静态成员的初始化与构造函数无关,因此全局语句确实是正确的方法。它不适合你吗?

    编辑:我刚刚意识到您出于某种原因试图避免使用单例访问方法。听起来很像Borg pattern。 :) 与您的具体问题无关,但我建议您重新考虑。

    【讨论】:

      【解决方案2】:

      你不能使用make_shared,但你可以直接创建实例:

      const std::shared_ptr<A> A::INSTANCE { new A };
      

      【讨论】:

      • 我很困惑。为什么 make_shared() 不能使用这种方法(或者为什么在这个变体没有的情况下它的可见性有问题)?无论如何,它有效,所以谢谢:-)
      • make_shared 在您的类之外定义,因此它无法访问私有构造函数。但是静态成员的初始化器被认为是类定义的一部分,因此它能够访问私有成员。
      猜你喜欢
      • 2012-10-09
      • 2010-11-14
      • 2011-02-15
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2020-06-12
      相关资源
      最近更新 更多