Singleton.hpp:
#pragma once template <typename T> class Singleton { private: Singleton(); virtual ~Singleton() {}; Singleton(const Singleton&); Singleton& operator=(const Singleton&) {}; static T* mInstance; public: template <typename... Args> // 创建单例 static T* Instance(Args&&... args) { if (mInstance == nullptr) { mInstance = new T(std::forward<Args>(args)...); // 完美转发 } return mInstance; } // 获取单例 static T* GetInstance() { if (mInstance == nullptr) { throw std::logic_error("instance never init..."); } return mInstance; } // 释放单例 static void DestroyInstance() { if (mInstance != nullptr) { delete mInstance; mInstance = nullptr; } } }; template<typename T> T* Singleton<T>::mInstance = nullptr; // 类的静态成员变量必须在外面进行初始化
测试:
#include <iostream> #include <string> #include "Singleton.hpp" using namespace std; struct TestA { TestA(const string&) { cout << "TestA left value." << endl; } TestA(const string&&) { cout << "TestA right value." << endl; } }; struct TestB { TestB(const string&) { cout << "TestB left value." << endl; } TestB(const string&&) { cout << "TestB right value." << endl; } }; struct TestC { TestC(int x, double y) { cout << "TestC construct." << endl; } void test() { cout << "TestC test." << endl; } }; int main(int, char *[]) { string str = "test...string"; // 创建TestA类型的单例 Singleton<TestA>::Instance(str); // 创建TestB类型的单例,临时变量str被move为右值,然后可以根据移动语义来避免复制 Singleton<TestB>::Instance(std::move(str)); // 创建TestC类型的单例,包含两个参数 auto aaa = Singleton<TestC>::Instance(1, 3.14); aaa->test(); Singleton<TestC>::GetInstance()->test(); // 释放 Singleton<TestA>::DestroyInstance(); Singleton<TestB>::DestroyInstance(); Singleton<TestC>::DestroyInstance(); system("pause"); return 0; }
相关推荐
内容概要:本文档介绍了三个经典的软件设计模式——单例模式(Singleton Pattern)、工厂模式(Factory Pattern)以及观察者模式(Observer Pattern)的具体实现,并给出了带有详细注释的C++代码范例。对每个设计模式都有...
在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于控制类的实例化过程,防止多处代码创建多个实例导致资源的浪费或者状态不一致的问题。在...
在这个“C++推箱子(单例模式)”项目中,我们将探讨如何利用C++实现一个经典的推箱子游戏,并应用设计模式中的单例模式来确保类的唯一实例。单例模式是软件设计模式中的一种,它限制类的实例化过程,使得在整个程序...
在C++中,实现单例模式有多种方式,这里我们将聚焦于懒汉式(Lazy Initialization)的实现。懒汉式单例的特点是延迟初始化,即只有在第一次使用时才会创建实例,这有助于提高程序的运行效率。 一、懒汉式单例模式的...
在C++中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,如数据库连接、日志系统或者配置文件等。单例模式的主要目的是限制类的实例化次数,确保在程序运行过程中只有一个...
采用C++ 的单例模式设计,
在C++中实现单例模式,通常有几种常见的方法: 1. **懒汉式**:也称为延迟初始化,只有当第一次调用单例对象时才创建实例。这种做法避免了在程序启动时就创建不必要的对象。不过,如果多个线程同时尝试创建实例,...
本文实例讲述了C++单例模式及其相关应用方法,分享给大家供大家参考。具体方法分析如下: 定义: 一个类有且仅有一个实例,并且提供一个访问它的全局访问点。 要点: 1、类只能有一个实例; 2、必须自行创建此实例;...
单例模式广泛应用于日志记录器、缓存管理、线程池、对话框、注册表设置等场景,以确保在整个应用程序中对共享资源的一致访问。 2. **简单工厂模式**: 简单工厂模式是一种创建型设计模式,它提供一个工厂类来负责...
在C++编程中,单例模式是...理解并熟练掌握单例模式的实现和应用,对于编写高效、可维护的C++代码至关重要。在实际开发中,应根据具体需求选择合适的单例实现方式,并注意避免潜在的问题,如线程安全问题、内存泄漏等。
在QT项目中,打开`.pro`文件进行编译,可以查看和运行单例模式的示例代码,了解其在实际应用中的效果。 总结起来,"QT_C++单例模式懒汉+饿汉.rar"这个压缩包主要介绍了如何在QT环境下使用C++实现单例模式的两种常见...
在给定的代码示例中,展示了如何使用 C++ 实现单例模式。下面将详细分析这段代码。 ```cpp #include using namespace std; class Singleton { public: static Singleton* Instance() // 全局访问点 { if (_...
本篇文章将详细探讨C++中实现单例模式的常见方法,以及它们在实际应用中的考虑因素。 1. **静态成员变量法**: 这是最简单的单例实现方式,通过将实例声明为类的静态成员变量来确保只有一个实例存在。例如: ```...
在C++中,单例模式常被用来解决特定场景下的问题,如在本例中,构建一个全局的日志模块,避免多次实例化和管理日志类的实例。 在GOF的《设计模式:可复用面向对象软件的基础》中,单例模式的定义是:保证一个类只有...
在Qt的Qml环境中,单例模式是一种设计模式,它允许在整个应用程序中创建一个全局访问点,确保某个类只有一个实例存在。这样的设计模式在需要共享数据或者服务时非常有用,避免了多处创建相同对象导致的数据不一致或...
单例模式是一种设计模式,它的核心思想是在整个应用程序中,确保某个类只有一个实例存在,并提供一个全局访问点。这种模式在软件开发中广泛应用于需要共享资源或者需要全局控制的场景,如配置管理、数据库连接、日志...
本篇将深入探讨两种重要的设计模式:工厂模式和单例模式,以及如何在VC(Visual C++)环境下实现它们。 ### 工厂模式 **定义**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当...
在软件开发中,单例模式是一种常用的设计模式,它的核心思想是确保一个类在整个应用程序运行期间只有一个实例存在。Qt库,作为一个跨平台的C++图形用户界面应用程序开发框架,也支持实现单例类。在Windows视音频技术...
在本文中,我们将深入探讨两个主要的设计模式:工厂模式和单例模式,以及它们在实际应用中的特点。 1. 工厂模式: 工厂模式是一种对象创建型设计模式,它提供了一种创建对象的最佳方式,通过将实例化过程封装在单独...
总结来说,C++中的单例模式通过控制类的实例化过程,确保在整个应用程序中只有一个实例存在,并提供全局访问点。正确地实现和使用单例模式,能够优化资源管理,提高代码的复用性,但同时也需要注意其可能带来的负面...