`std::make_shared` 无法直接用于单例模式,因为它需要访问构造函数,而构造函数通常是私有的

std::make_shared 在创建对象时会调用构造函数,而在单例模式下,构造函数通常是私有的,因此不能直接通过 std::make_shared 来创建对象。

为什么 std::make_shared 不适用于单例模式?

在单例模式中,我们希望确保一个类只有一个实例,并且通常会将构造函数设为私有或删除,以防止外部直接创建对象。例如:

cpp 复制代码
class Singleton {
private:
    Singleton() = default;  // 私有构造函数
public:
    static std::shared_ptr<Singleton> GetInstance();
};

如果使用 std::make_shared<T>(),它会尝试直接调用 T 的构造函数,而在单例模式中,构造函数是私有的或被删除的,导致编译错误。例如:

cpp 复制代码
std::shared_ptr<T> instance = std::make_shared<T>();  // 会失败,因为T的构造函数是私有的

为什么 new T 可以工作?

在使用 new T 时,std::shared_ptr<T>(new T) 会先通过 new 操作符分配内存并构造对象。由于 new 是在函数内部执行的,它并不受类的访问控制限制。即使构造函数是私有的,new T 仍然可以创建对象。

实际上,std::shared_ptr<T>(new T) 本质上绕过了构造函数的访问控制,它直接使用 new 操作符来分配内存和构造对象。而 std::make_shared<T>() 会在内部调用构造函数,因此在构造函数是私有的情况下,它无法正常工作。

单例模式的实现:

在单例模式中,我们一般通过 new 来动态创建对象,以便绕过私有构造函数的限制。new T 允许我们通过 std::shared_ptr 来管理对象,并且只创建一个唯一的实例。

因此,正确的做法是继续使用 std::shared_ptr<T>(new T),因为 std::make_shared 会尝试直接调用构造函数,这与单例模式的设计(构造函数是私有的)不兼容。

结论:

  • std::make_shared 需要调用构造函数,而在单例模式下,构造函数通常是私有的,因此不能使用 std::make_shared
  • new T 可以绕过构造函数的访问限制,因此可以在单例模式中使用它来动态创建唯一实例。
相关推荐
h_a_o777oah19 小时前
【算法专项】扩展域并查集:原理详解及解决大部分种类并查集问题(洛谷P5937 P2024 C++代码)
数据结构·c++·算法·acm·并查集·扩展域·逻辑建模
雾沉川20 小时前
Visual C++ 运行库合集 v105.0 部署与故障排查技术指南
开发语言·c++·dll
丘山望岳21 小时前
剑起霜华——平衡二叉树(AVL树 )精讲
开发语言·数据结构·c++
Boom_Shu21 小时前
浅拷贝与深拷贝
开发语言·c++·算法
Mortalbreeze21 小时前
C++ Lambda表达式详解:从捕获列表到底层原理
开发语言·c++
为何创造硅基生物21 小时前
LVGL
c++·ui
只做人间不老仙21 小时前
C++ grpc 拦截器示例学习
开发语言·c++·学习
qeen8721 小时前
【C++】类与对象之零散知识点补充(四)
c++·笔记·学习·语法
Irissgwe1 天前
顺序表和链表
数据结构·c++·链表·c·顺序表·线性表
牛油果子哥q1 天前
二叉树(Binary Tree)零基础精讲,树基础概念、树形分类、核心性质、递归/层序遍历、完整代码与面试考点全解
c++·面试·数据挖掘