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

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

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

相关文章

  • win7系统提示”OXC0000102”的错误代码而无法将请求的数据放入内存的解决方法

    “OXC0000102″错误代码的解决方法 概述 当你在使用Win7系统时,如果遇到了错误代码“OXC0000102”,你就会发现自己无法完成所需的操作,提示中表示你的数据无法放入内存。 这个错误一般是由于系统文件损坏或者硬件故障导致的,解决这个问题需要我们进行一些操作。 解决方法 以下是解决OXC0000102错误代码的方法: 1. 恢复系统 通过系统恢复…

    C 2023年5月24日
    00
  • C语言实现简单航班管理系统

    C语言实现简单航班管理系统攻略 前言 本攻略会从需求分析、设计思路、代码编写三个方面来讲解如何实现简单的航班管理系统,希望能为大家提供一些帮助。 需求分析 首先,我们需要明确航班管理系统的功能需求,本系统需要实现以下功能:1. 查看所有航班的信息,包括航班号、起飞时间、起飞地点、目的地、可用座位等;2. 根据起飞地点和目的地筛选航班信息;3. 预订座位,成功…

    C 2023年5月23日
    00
  • C 标准库 string.h

    C 标准库 string.h 提供了一系列字符串操作函数,可以在 C 语言程序中方便地进行字符串处理。下面将依次介绍这些函数的使用方法。 strcpy char* strcpy(char* dest, const char* src); 将字符串 src 复制到字符串 dest,并返回 dest。需要注意的是,函数会复制字符串到 dest 的末尾,并在末尾加…

    C 2023年5月10日
    00
  • QT基于TCP实现网络聊天室程序

    首先我们需要准备QT的开发环境,并且熟悉QT的基本开发流程。在此不再赘述。 创建QT项目 首先需要创建一个QT项目,选择一个QT GUI Application即可。在创建过程中,选择需要包含网络模块。 添加TCP服务器 我们需要添加一个TCP服务器来实现网络聊天室。在创建TCP服务器时,需要指定服务器绑定的IP地址和端口号。以下是示例代码: QTcpSer…

    C 2023年5月30日
    00
  • C语言 详解如何删除有序数组中的重复项

    C语言详解如何删除有序数组中的重复项 在C语言中,要删除有序数组中的重复项,可以使用双指针法来实现。具体步骤如下: 定义两个指针p和q,分别指向数组的第一个元素。 使用循环遍历数组,当q指针所指向的元素与p指针所指向的元素相同时,q指针向后移动一位,即跳过该重复项。 当q指针所指向的元素与p指针所指向的元素不同时,将q指针所指向的元素赋值给p指针的下一个位置…

    C 2023年5月23日
    00
  • C语言栈的表示与实现实例详解

    C语言栈的表示与实现实例详解 栈的概念 栈是一种特殊的线性表,它具备后进先出(Last-In-First-Out,LIFO)的特性。栈实现的基本操作有入栈(push)和出栈(pop)两种。 栈的表示 栈可以通过数组或链表两种数据结构进行表示。 数组表示 数组表示的栈是一段连续的内存空间,可以使用数组下标代表每个栈元素的位置。数组的顶部指针用于标识当前栈顶元素…

    C 2023年5月23日
    00
  • C语言数组实现公交车管理系统

    下面是“C语言数组实现公交车管理系统”的完整攻略: 1. 设计思路 公交车管理系统需要对公交路线、车辆和乘客信息进行管理,我们可以设计三个数组来存储这些信息: bus_line[]数组:存储公交路线信息,每个元素表示一条公交路线,包括路线编号、起始站点、终点站点和票价等信息。 bus[]数组:存储车辆信息,每个元素表示一辆车,包括车牌号、所属路线、座位数和已…

    C 2023年5月23日
    00
  • 详解java 中Spring jsonp 跨域请求的实例

    首先要说明的是jsonp请求是一种跨域方式,它的实现原理是网页通过添加一个元素来向服务器请求JSON数据,服务器接收到请求后,将数据放在一个指定的回调函数中返回给客户端,客户端再对返回的数据进行处理。下面就是详解java中Spring jsonp跨域请求的完整攻略。 一、前端实现jsonp请求 创建一个函数,用来发送jsonp请求并处理返回的数据: func…

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