欧洲男女做受视频网站,优品ppt,优秀网站设计有哪些,芜湖的网站建设公司C笔记之单例通过GetInstance传递参数
code review! 文章目录 C笔记之单例通过GetInstance传递参数例1.普通指针的单例例2.结合智能指针和std::call_once例3.编译不通过的错误例子#xff0c;在GetInstance内不可以使用std::make_shared来创建对象 例1.普通指针的单例 运行 …C笔记之单例通过GetInstance传递参数
code review! 文章目录 C笔记之单例通过GetInstance传递参数例1.普通指针的单例例2.结合智能指针和std::call_once例3.编译不通过的错误例子在GetInstance内不可以使用std::make_shared来创建对象 例1.普通指针的单例 运行
代码
#include iostream
#include stringclass Singleton {public:// 获取单例实例的静态函数可以传递构造函数所需的参数static Singleton *GetInstance(const std::string value) {if (!instance) {instance new Singleton(value);}return instance;}void PrintValue() {std::cout value std::endl;}private:// 私有构造函数防止直接实例化Singleton(const std::string val) : value(val) {}static Singleton *instance;std::string value;
};// 初始化静态成员变量
Singleton *Singleton::instance nullptr;int main() {Singleton *instance1 Singleton::GetInstance(Instance 1);instance1-PrintValue(); // 输出Instance 1Singleton *instance2 Singleton::GetInstance(Instance 2);instance2-PrintValue(); // 输出Instance 1因为单例已经创建不会再次创建新实例return 0;
}例2.结合智能指针和std::call_once 使用 std::shared_ptr 和 std::call_once 来实现单例模式并避免了调用私有构造函数 在这个示例中通过直接使用 new Singleton(value) 来创建 std::shared_ptrSingleton 的实例这样就能够调用私有的构造函数。
运行
代码
#include iostream
#include memory
#include string
#include mutexclass Singleton {
public:// 获取单例实例的静态函数可以传递构造函数所需的参数static std::shared_ptrSingleton GetInstance(const std::string value) {std::call_once(initFlag, []() {instance std::shared_ptrSingleton(new Singleton(value));});return instance;}void PrintValue() {std::cout value std::endl;}private:// 私有构造函数防止直接实例化Singleton(const std::string val) : value(val) {}static std::shared_ptrSingleton instance;static std::once_flag initFlag;std::string value;
};// 初始化静态成员变量
std::shared_ptrSingleton Singleton::instance nullptr;
std::once_flag Singleton::initFlag;int main() {std::shared_ptrSingleton instance1 Singleton::GetInstance(Instance 1);instance1-PrintValue(); // 输出Instance 1std::shared_ptrSingleton instance2 Singleton::GetInstance(Instance 2);instance2-PrintValue(); // 输出Instance 1因为单例已经创建不会再次创建新实例return 0;
}例3.编译不通过的错误例子在GetInstance内不可以使用std::make_shared来创建对象 编译报错
在 C 中std::make_shared 会调用构造函数来创建对象但是由于构造函数是私有的会导致编译错误。