最近更新于 2023-03-10 12:04

环境

Debian 11(arm64)

编译器 g++ 10.2.1;编译标准 C++20;参数:-std=c++20 -no-pie -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=format-security -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -g -O0

单例模式

模板

在这种设计模式下,一个类只有一个实例。一般的实现方法是将构造函数和析构函数设置为私有,同时禁用拷贝和赋值。类中定义一个静态变量用于储存类的实例,它将不依赖于具体对象,静态变量只初始化一次,将作为唯一的实例,另外定义一个静态成员函数用于获取这个实例。

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

    private:
        // 禁止拷贝和赋值
        Singleton(const Singleton &) = delete;
        Singleton &operator=(const Singleton &) = delete;

        Singleton() {} // 构造函数
        ~Singleton() {} // 析构函数
};

示例

先获取一个实例,对它存入信息,再获取一个实例,取出来的信息依然是第一次获取的实例存入的信息

#include <iostream>

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

        void set(std::string name, int age)
        {
            m_name = name;
            m_age = age;
        }

        void print()
        {
            std::cout << m_name << " " << m_age << std::endl;
        }

    private:
        Singleton(const Singleton &) = delete;
        Singleton &operator=(const Singleton &) = delete;

        Singleton() {}
        ~Singleton() {}

        std::string m_name;
        int m_age;
};

int main()
{
    Singleton &s1 = Singleton::getInstance();
    s1.set("小明", 20);

    Singleton &s2 = Singleton::getInstance();
    s2.print();
}

file

作者 IYATT-yx