最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用宏函數(shù)實現(xiàn)單例模板詳解

 更新時間:2023年02月10日 14:23:43   作者:ufgnix0802  
在我們?nèi)粘i_發(fā)中,無可避免需要使用單例模式進行設(shè)計類對象。這篇文章主要介紹了如何使用宏函數(shù)實現(xiàn)單例模板,感興趣的小伙伴可以了解一下

在我們?nèi)粘i_發(fā)中,無可避免需要使用單例模式進行設(shè)計類對象,那么實際上我們寫單例格式基本都是一樣的,那么每次都要寫幾乎一模一樣的代碼來實現(xiàn)我們需要的單例對象是不是會覺得很累?下面博主提供一種單例模板來完成我們?nèi)粘TO(shè)計單例類,提高工作效率。既然封裝了,那么當然是封裝一個線程安全的單例模板,如下:

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() {                                                       \
        /* 使用雙重檢查,外層檢查是為了避免鎖住過大的面積,從而導致鎖的競爭特別頻繁;*/\
        /* 內(nèi)層檢查是為了確保只在其它線程沒有搶占鎖完成初始化工作而設(shè)計。*/           \
        /* 這種做法在Java下是正確的,但是在C++下則沒有保證。*/                      \
        /* std::once_flag 和 std::call_once:它們內(nèi)部利用互斥量和條件變量組合,*/   \
        /* 實現(xiàn)這樣的語義。值得一提的是,如果執(zhí)行過程中拋出異常,標準庫的設(shè)施不認為 */ \
        /* 這是一次「成功的執(zhí)行」。于是其他線程可以繼續(xù)搶占鎖來執(zhí)行函數(shù)。 */          \
        /* std:call_once確保函數(shù)或代碼片段在多線程環(huán)境下,只需要執(zhí)行一次。 */        \
        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 庫函數(shù) int atexit(void (*func)(void)) 當程序正常終止時,調(diào)用指定的*/  \
        /* 函數(shù)func。您可以在任何地方注冊你的終止函數(shù),*/                           \
        /* 但它會在程序終止的時候被調(diào)用。*/                                        \
                ::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文件中那么可能出現(xiàn)重定義的問題,博主設(shè)計的單例模板,只適用于.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;
}

運行結(jié)果:

到此這篇關(guān)于C++使用宏函數(shù)實現(xiàn)單例模板詳解的文章就介紹到這了,更多相關(guān)C++宏函數(shù)實現(xiàn)單例模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++類常量和類枚舉

    C++類常量和類枚舉

    這篇文章主要介紹了C++類常量和類枚舉,給類當中定義一些常量,可以給所有類的對象使用,比如說我們在類當中定義一個數(shù)組,希望可以定義一個常量,用來初始化數(shù)組的長度,那么下面我i嗎就來看看過程當如何吧
    2022-01-01
  • 深入了解C語言結(jié)構(gòu)化的程序設(shè)計

    深入了解C語言結(jié)構(gòu)化的程序設(shè)計

    這篇文章主要介紹了C語言編程中程序的一些基本的編寫優(yōu)化技巧,文中涉及到了基礎(chǔ)的C程序內(nèi)存方面的知識,非常推薦!需要的朋友可以參考下
    2021-07-07
  • C語言詳細圖解浮點型數(shù)據(jù)的存儲實現(xiàn)

    C語言詳細圖解浮點型數(shù)據(jù)的存儲實現(xiàn)

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-05-05
  • 使用VScode搭建ROS開發(fā)環(huán)境的教程詳解

    使用VScode搭建ROS開發(fā)環(huán)境的教程詳解

    這篇文章主要介紹了使用VScode搭建ROS開發(fā)環(huán)境,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境

    VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境

    我們在windows10中使用VS Code做C++程序開發(fā)過程中,需要安裝MSYS2和MinGW,下面這篇文章主要給大家介紹了關(guān)于VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 一文搞懂Codec2解碼組件

    一文搞懂Codec2解碼組件

    這篇文章主要介紹了Codec2解碼組件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++中繼承與組合的區(qū)別詳細解析

    C++中繼承與組合的區(qū)別詳細解析

    C++的“繼承”特性可以提高程序的可復用性。正因為“繼承”太有用、太容易用,才要防止亂用“繼承”
    2013-09-09
  • 一篇文章帶你了解c++運算符重載

    一篇文章帶你了解c++運算符重載

    下面小編就為大家?guī)硪黄钊肜斫釩++運算符重載。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-08-08
  • C++中的const限定符的使用和作用

    C++中的const限定符的使用和作用

    C++ 中的 const 限定符用于聲明不可變量,即在變量聲明時指定該變量的值不可修改。它的使用可以幫助程序員避免一些常見的編程錯誤,如誤修改不應該被修改的變量的值等
    2023-05-05
  • C++while和do-while語句求和詳解

    C++while和do-while語句求和詳解

    對于C語言中的while與do-while,相信很多都再熟悉不過了,最近在工作中就用到了,所以想著總結(jié)一下,方便自己或者有需要的朋友們參考借鑒,文中通過示例代碼介紹的很詳細,感興趣的朋友們下面來一起學習學習吧
    2021-08-08

最新評論

女性| 赣州市| 闽侯县| 大城县| 宝丰县| 新闻| 土默特右旗| 陇西县| 瓦房店市| 新余市| 阳山县| 台山市| 绥宁县| 铜鼓县| 莱芜市| 沅陵县| 额济纳旗| 尚义县| 靖西县| 泰安市| 乌什县| 普格县| 右玉县| 武定县| 县级市| 平远县| 年辖:市辖区| 韩城市| 绩溪县| 西吉县| 临邑县| 丰顺县| 女性| 龙游县| 沅江市| 岑巩县| 濉溪县| 志丹县| 大连市| 常熟市| 日照市|