广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++使用宏函数实现单例模板详解
  • 183
分享到

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

C++宏函数实现单例模板C++单例模板C++宏函数 2023-02-10 15:02:36 183人浏览 独家记忆
摘要

目录ISingleton.hpp使用方式Aclass.hAclass.cppmain.c在我们日常开发中,无可避免需要使用单例模式进行设计类对象,那么实际上我们写单例格式基本都是一样

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

ISingleton.hpp

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






#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;

                         


#define SINGLETON_CLASS_FUNC_IMPL(Class)                                        \
    Class& Class::Ins() {                                                       \
        \
                   \
                              \
           \
         \
                  \
                \
        std::call_once(m_singletonFlag, &Class::InitSingleton);                 \
        assert(m_ins != NULL);                                                  \
        return *m_ins;                                                          \
    }                                                                           \
                                                                                \
    void Class::InitSingleton() {                                               \
        m_ins = new Class;                                                      \
        if (m_ins) {                                                            \
          \
                                   \
                                                \
                ::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++使用宏函数实现单例模板详解的文章就介绍到这了,更多相关C++宏函数实现单例模板内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++使用宏函数实现单例模板详解

本文链接: https://www.lsjlt.com/news/195565.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作