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

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对象是否被创建,如果没有,创建单例对象并返回实例化的对象。在这种情况下,要注意它的线程安全性,并且我们可以通过适当的修改来解决这个问题。

阅读剩余 61%

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

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

相关文章

  • 面向对象三大特性的意义讲解

    面向对象编程中的三大特性分别是封装、继承和多态,下面我将逐一进行讲解。 封装 封装是将数据和方法包装在一起,形成一个不可分割的整体,对外界进行隐藏。这样可以控制数据被外部直接访问的情况,从而保证数据的安全性和可靠性。比如在Java中,我们可以使用private关键字修饰一个属性或方法,来实现封装。示例代码如下: public class Person { p…

    C 2023年5月22日
    00
  • C++实现模拟shell命令行(代码解析)

    C++实现模拟shell命令行(代码解析) 简介 本文主要介绍如何使用C++实现模拟shell命令行。通过本文,您将学习到如何使用C++实现简单的命令行操作,以及理解如何在命令行中传递参数和执行命令。 实现过程 步骤一:从命令行读取输入 首先我们需要获取用户在命令行中输入的内容,我们可以使用getchar()实现从标准输入读取输入的字符。例如: char c…

    C 2023年5月23日
    00
  • C语言单链表实现通讯录管理系统

    C语言单链表实现通讯录管理系统 本文介绍如何使用C语言的单链表数据结构来实现通讯录管理系统。 数据结构设计 首先,我们需要设计出通讯录中需要保存的数据类型及其结构。在本教程中,我们仅考虑每个联系人需要保存姓名和电话。 struct Contact { char name[20]; char phone[20]; struct Contact* next; }…

    C 2023年5月23日
    00
  • C/C++经典面试题(附答案)

    首先,我们需要理解“C/C++经典面试题(附答案)”这篇文章的目的。该文章旨在为C/C++开发人员提供一些常见的面试问题,并通过详细的答案解释帮助读者更好地掌握这些问题的解决方法。以下是该文章的攻略: 1. 概述 在文章的开头,我们应该简要介绍该文章的内容概述,例如列出所介绍的问题以及解决方法。同时,我们可以提供一些关于本文的基本信息,例如文章的作者、出版时…

    C 2023年5月23日
    00
  • CCleaner怎么设置文件列表?CCleaner设置文件列表方法

    下面是关于“CCleaner怎么设置文件列表?CCleaner设置文件列表方法”的完整攻略: 1. 打开CCleaner并进入“选项”页面 首先双击打开CCleaner应用程序,在左侧导航栏中选择“选项”这一栏位。 2. 进入“排除”页面 在选项页面中,选择“排除”这一栏位。 3. 设置文件列表 在排除页面中,可以看到两个大的文件列表: 包含项:表示CCle…

    C 2023年5月23日
    00
  • 配置iptables实现本地端口转发的方法详解

    下面是关于配置iptables实现本地端口转发的方法详解,包含两条示例说明: 一、什么是iptables iptables是Linux系统中基于网络包过滤的软件,它可以管理网络连接,实现网络包的过滤、NAT、端口转发、防火墙等功能,非常常用。 二、本地端口转发 本地端口转发是指将客户端请求的某个端口转发到本机的另一个端口,或者将本机请求的某个端口转发到远程机…

    C 2023年5月24日
    00
  • C++ 如何使用栈求解中缀、后缀表达式的值

    C++ 中,我们可以使用栈来求解中缀表达式的值或者先将中缀表达式转换为后缀表达式再进行求解。下面我将演示如何使用栈求解中缀表达式的值和后缀表达式的值。 求解中缀表达式的值 步骤 创建两个栈,一个用于存储操作数,另一个用于存储运算符。 从左到右遍历中缀表达式。 如果当前字符是数字,则入操作数栈。 如果当前字符是运算符,则与运算符栈中的栈顶运算符比较,如果当前运…

    C 2023年5月23日
    00
  • java中的空指针异常情况以及解决方案

    首先我们先来了解一下Java中的空指针异常。 什么是空指针异常 空指针异常,顾名思义,就是在程序中使用了一个值为null的对象引用,而没有进行判空处理,从而导致程序抛出异常。 在Java中,当我们尝试调用一个null对象的方法时,就会抛出空指针异常。 例如,以下代码中就存在空指针异常的情况: String str = null; int len = str.…

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