C++实现单例模式的方法

yizhihongxing

C++实现单例模式的方法可以通过以下两种方式实现:

1. 饿汉式单例模式

在饿汉式单例模式中,单例实例在程序启动时被立即初始化,它是线程安全的。具体实现如下:

class Singleton  
{  
private:  
    Singleton() {}  
    static Singleton* m_instance;  
public:  
    static Singleton* Instance()  
    {  
        return m_instance;  
    }  
};  
Singleton* Singleton::m_instance = new Singleton();

在上面的代码中,构造函数被声明为私有,所以它不会被外部调用。而静态的指向Singleton实例的指针变量m_instance也是在类中声明的。这种实例化方法使得饿汉式单例模式的实例化过程在程序初始化期间完成。

下面是一个使用饿汉式单例模式的示例:

#include <iostream>
using namespace std;
class Singleton
{
private:
    Singleton() {}

public:
    static Singleton& getInstance()
    {
        static Singleton instance;
        return instance;
    }

    Singleton(Singleton const&) = delete;
    void operator=(Singleton const&) = delete;

    void showMessage()
    {
        cout << "Singleton Pattern\n";
    }
};

int main()
{
    Singleton& obj1 = Singleton::getInstance();
    Singleton& obj2 = Singleton::getInstance();

    obj1.showMessage();
    obj2.showMessage();

    return 0;
}

在这个示例中,我们的Singleton类有一个私有的构造函数,防止从外部调用构造函数。对getInstance方法进行调用返回一个指向静态的Singleton实例的指针的引用。这确保了对象只被实例化一次并且只被当做单例对象使用。

2. 懒汉式单例模式

懒汉式单例模式与饿汉式单例模式相比,可以在程序运行期间实例化一个单例类。但是,它不是线程安全的并且当应用程序调用单例类时,它可能需要等一段时间才能创建单例对象。具体实现如下:

class Singleton  
{  
private:  
    Singleton() {}  
    static Singleton* m_instance;  
public:  
    static Singleton* Instance()  
    {  
        if (m_instance == nullptr)  
            m_instance = new Singleton();  
        return m_instance;  
    }  
};  
Singleton* Singleton::m_instance = nullptr;

在上面的代码中,Instance方法检查静态变量Singleton::m_instance是否为NULL,如果是,则实例化Singleton类。这种实例化方式使得懒汉式单例模式在第一次调用Instance方法时实例化对象。

下面是一个使用懒汉式单例模式的示例:

#include <iostream>
using namespace std;
class Singleton
{
private:
    Singleton() {}

public:
    static Singleton& getInstance()
    {
        static Singleton instance;
        return instance;
    }

    Singleton(Singleton const&) = delete;
    void operator=(Singleton const&) = delete;

    void showMessage()
    {
        cout << "Singleton Pattern\n";
    }
};

int main()
{
    Singleton& obj1 = Singleton::getInstance();
    Singleton& obj2 = Singleton::getInstance();

    obj1.showMessage();
    obj2.showMessage();

    return 0;
}

在上面的示例中,Singleton类的构造函数是私有的,getInstance方法检查Singleton对象是否被创建,如果没有,创建单例对象并返回实例化的对象。在这种情况下,要注意它的线程安全性,并且我们可以通过适当的修改来解决这个问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现单例模式的方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C实现分子沉积模拟的示例代码

    让我详细讲解一下“C实现分子沉积模拟的示例代码”的完整攻略。 简介 分子沉积模拟(Molecular Deposition Simulation)是一种通过模拟分子在表面上附着的过程来研究表面物理性质的方法。在这个模拟中,分子在表面上的位置和速度是随机生成的。模拟过程中,我们通常关注分子的堆积特征和表面的形貌演化。 在这个示例代码中,我们将展示如何使用C语言…

    C 2023年5月24日
    00
  • C++文件的操作及小实验示例代码详解

    接下来我将为你详细讲解C++文件的操作及小实验示例代码详解。 C++文件的操作 C++文件的操作是指在程序中对文件进行读取、写入、追加和删除等操作。在C++中,可以通过fstream库来实现文件的操作。fstream库包括以下三个类:ifstream,ofstream和fstream。其中,ifstream和ofstream分别用于读取和写入文件,fstre…

    C 2023年5月22日
    00
  • Android蓝牙服务查找附近设备分析探索

    针对这个主题,我将为您提供一份完整的攻略。 Android蓝牙服务查找附近设备分析探索 1. 简介 蓝牙是一种近场无线通信技术,可以在手机、手表、耳机、电视和电脑等设备之间进行数据传输。Android蓝牙服务是Android系统提供的蓝牙应用程序编程接口(API),提供了一系列方法和工具,用于探索、连接和与其他蓝牙设备通信。在本文中,我们将介绍如何使用And…

    C 2023年5月23日
    00
  • Jmeter 使用Json提取请求数据的方法

    以下是详细讲解JMeter使用JSON提取请求数据的方法的完整攻略。 什么是JSON Extractor? JSON Extractor是JMeter插件之一,其主要功能是从HTTP响应中的JSON数据中提取出所需数据。 JSON Extractor配置 JSON Extractor是基于JMeter的post-processor,它可以获取JSON数据并在…

    C 2023年5月23日
    00
  • C++控制台实现密码管理系统

    为了编写C++控制台实现密码管理系统,我们需要遵循以下步骤: 步骤1:设计数据结构 设计数据结构是密码管理系统的第一步,我们需要确定各种密码信息的存储方式。我们可以选择使用结构体、类或数组来存储不同的用户信息。 例如: struct Password{ char username[15]; char password[15]; char descriptio…

    C 2023年5月23日
    00
  • c++编写简单的计算器程序

    下面是“C++编写简单的计算器程序”的攻略: 1. 需求分析 在开始编写程序之前,需要先确定程序的需求,即需要实现哪些功能。对于一个简单的计算器程序来讲,它需要实现以下功能: 接收用户输入的两个数字 接收用户输入的运算符 根据用户输入的运算符进行计算,并输出结果 2. 代码实现 接下来,我们开始编写代码。为了方便起见,我们将代码分为以下几个步骤: 2.1 接…

    C 2023年5月23日
    00
  • c++代码各种注释示例详解

    C++代码注释详解 C++代码注释是一种为程序添加额外说明、解释和提示的方式,它有助于程序的可读性和可维护性。 本文将详细讲解C++代码各种注释示例及说明。 单行注释 单行注释以//开始,直到该行结束,可用于简单的注释或激活/屏蔽代码。 示例: int a = 5; // 定义变量a,赋值为5 // int b = 10; // 激活该行会定义变量b,赋值为…

    C 2023年5月23日
    00
  • 跟我学习javascript解决异步编程异常方案

    跟我学习JavaScript解决异步编程异常方案 异步编程 异步编程是Javascript中非常重要的概念,它是指在代码执行过程中,某些操作的完成时间是不确定的,也就是说可能会出现异步执行的情况。比如说通过AJAX请求数据,等待响应的过程中,代码并没有被阻塞,而是继续往下执行。异步编程为我们提供了更加高效的编程方式,但也带来了一些问题。其中一些问题是在异步函…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部