c++ - make_unique 不会为创建单例实例而编译

标签 c++ singleton c++14 unique-ptr private-constructor

全部,

我正在使用 C++14 并正在制作一个或多或少的标准单例。我正在使用最新的 Visual Studio 2017。此代码有效:

#include <memory>
class A
{
public:
  static A& getInstance()
  {
    if (instance == nullptr)
      instance = std::unique_ptr<A>(new A());
    return *instance;
  }

private:
  A() {}
  static std::unique_ptr<A> instance;
};
std::unique_ptr<A> A::instance = nullptr;

但是,当我将单例实例的创建更改为:

instance = std::make_unique<A>();

我在尝试访问私有(private)成员时遇到编译错误:

Error   C2248   'A::A': cannot access private member declared in class 'A'      
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.14.26428\include\memory   2510    

这对我来说感觉像是一个错误,因为这两种形式在功能上应该是相同的?想法?

最佳答案

std::unique_ptr<>的目的|就是控制指向的对象的生命周期。你可以传递 std::unique_ptr<>周围,​​但这也将转移指向的对象的所有权。这个概念和单例的概念不太吻合。只有一个地方允许创建(或删除)单例。你真的不需要 std::unique_ptr<>为了那个原因。正如评论中已经说过的,有更简单的方法。我更喜欢@Praetorian 的建议:

static A& getInstance() 
{
     static A instance;
     return instance;
}

不能使用std::make_unique<>()的原因实例化你的类是构造函数是私有(private)的。要访问它,您需要访问函数是 friend .看看How to make std::make_unique a friend of my class为了那个原因。另一种解决方案是提供一个需要私有(private)类型作为参数的公共(public)构造函数,如 int this solution 所述。 .

关于c++ - make_unique 不会为创建单例实例而编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50995599/

相关文章:

C++ 风格与性能?

c++ - 添加打印语句可将代码速度提高一个数量级

c++ - 为什么定义 "++"operator over bool ?但是 "--"不在 C++ 中

JavaScript 单例模式 - 差异?

linux - Boost Spirit 3.0.0的安装步骤是怎样的?

c++ - 为什么在这个函数中抛出这个 std::out_of_range ?

iOS 委托(delegate)和单例模式

extjs - ExtJs4 中的单例

c++ - 以随机大小初始化 std::array

c++ - 不支持 vector 的 noexcept 要求