伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

C++使用宏函数实现单例模板详解

目录

    ISingleton.hpp使用方式
      Aclass.hAclass.cppmain.c


在我们日常开发中,无可防止需要使用单例形式停止设计类对象,那么实际上我们写单例格式根本都是一样的,那么每次都要写几乎一模一样的代码来实现我们需要的单例对象是不是会觉得很累?下面博主提供一种单例模板来完成我们日常设计单例类,进步工作效率。既然封装了,那么当然是封装一个线程安全的单例模板,如下:

ISingleton.hpp

#pragma once
#include <stdlib.h>
#include <assert.h>
#include <thread>
#include <mutex>

/******************************************************************************/
/**********************ufgnix0802:单例宏定义(线程安全)*************************/
/******************************************************************************/

#define SINGLETON_CLASS_DEFAULT(Class)                                          \
    private:                                                                    \
        Class() {}                                                              \
        ~Class() {}                                                             \
        Class(Class &other) {}                                                  \
        Class(const Class &other) {}                                            \
        Class& operator=(Class &other) {}                                       \
        Class& operator=(const Class &other) {}                                 \

#define SINGLETON_CLASS_FUNC_DECL(Class)                                        \
    public:                                                                     \
        static Class& Ins();                                                    \
    private:                                                                    \
        static void InitSingleton();                                            \
                                                                                \
        static void Release();                                                  \
                                                                                \
        SINGLETON_CLASS_DEFAULT(Class)                                          \
private:                                                                        \
    static std::once_flag m_singletonFlag;                                      \
    static Class* m_ins;

/* https://liam.page/2020/10/27/implement-a-singleton-class-template-in-cxx/ */                        
/* https://liam.page/2017/01/17/layers-and-operation-system/#CPU-%E5%8A%A8%E6%80%81%E8%B0%83%E5%BA%A6 */

#define SINGLETON_CLASS_FUNC_IMPL(Class)                                        \
    Class& Class::Ins() {                                                       \
        /* 使用双重检查,外层检查是为了防止锁住过大的面积,从而导致锁的竞争特别频繁;*/\
        /* 内层检查是为了确保只在其它线程没有抢占锁完成初始化工作而设计。*/           \
        /* 这种做法在Java下是正确的,但是在C++下则没有保证。*/                      \
        /* std::once_flag 和 std::call_once:它们内部利用互斥量和条件变量组合,*/   \
        /* 实现这样的语义。值得一提的是,假设执行过程中抛出异常,规范库的设备不认为 */ \
        /* 这是一次「胜利的执行」。于是其他线程可以继续抢占锁来执行函数。 */          \
        /* std:call_once确保函数或代码片段在多线程环境下,只需要执行一次。 */        \
        std::call_once(m_singletonFlag, &Class::InitSingleton);                 \
        assert(m_ins != NULL);                                                  \
        return *m_ins;                                                          \
    }                                                                           \
                                                                                \
    void Class::InitSingleton() {                                               \
        m_ins = new Class;                                                      \
        if (m_ins) {                                                            \
        /* C 库函数 int atexit(void (*func)(void)) 当程序正常终止时,调用指定的*/  \
        /* 函数func。您可以在任何地方注册你的终止函数,*/                           \
        /* 但它会在程序终止的时候被调用。*/                                        \
                ::atexit(Release);                                              \
        }                                                                       \
    }                                                                           \
                                                                                \
    void Class::Release() {                                                     \
         if (m_ins) {                                                           \
              delete m_ins;                                                     \
              m_ins = NULL;                                                     \
         }                                                                      \
    }                                                                  

#define SINGLETON_CLASS_VARIABLE_IMPL(Class)                                    \
        std::once_flag Class::m_singletonFlag;                                  \
        Class* Class::m_ins = NULL;

#define SINGLETON_CLASS_IMPL(Class)                                             \
        SINGLETON_CLASS_VARIABLE_IMPL(Class)                                    \
        SINGLETON_CLASS_FUNC_IMPL(Class)                                       

使用方式

注意,假设我们的单例类对象在.hpp文件中那么可能呈现重定义的问题,博主设计的单例模板,只适用于.h和.cpp,即声明和定义分开单例类对象。

Aclass.h

#include "ISingleton.hpp"

class Aclass {
    //声明
    SINGLETON_CLASS_FUNC_DECL(Aclass)

public:
    int a;

};

Aclass.cpp

#include "Aclass.h"

//定义
SINGLETON_CLASS_IMPL(Aclass);

main.c

#include "Aclass.h"
int main() {
    //Aclass a;  err
    Aclass::Ins().a = 5;
    std::cout << Aclass::Ins().a << std::endl;
    return 0;
}
运行结果:
C++使用宏函数实现单例模板详解-1.jpg

到此这篇关于C++使用宏函数实现单例模板详解的文章就介绍到这了,更多相关C++宏函数实现单例模板内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

亮亮
注册会员
主题 19
回复 13
粉丝 0
|网站地图
快速回复 返回顶部 返回列表