我有一个带有私有构造函数的单例类。在静态工厂方法中,我执行以下操作:
shared_ptr<MyClass> MyClass::GetInstance()
{
static once_flag onceFlag;
call_once(onceFlag, []() {
if (_instance == nullptr)
_instance.reset(new MyClass());
});
return _instance;
}
如果我使用
_instance = make_shared<MyClass>();
代码无法编译。我的问题是:为什么
new
可以调用私有构造函数而make_shared
不能呢?
shared_ptr
实例(我假设_instance
是shared_ptr<MyClass>
)的情况下,共享单例的所有权是毫无意义的。检查_instance
是否为nullptr也是毫无意义的,因为此块受once标志保护。在这种情况下使make_shared
工作(例如通过声明它为friend)也没有意义,因为那样就可以在任何地方创建MyClass
实例了。 - user7860670