欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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() {                                                       \
        /* 使用雙重檢查,外層檢查是為了避免鎖住過(guò)大的面積,從而導(dǎo)致鎖的競(jìng)爭(zhēng)特別頻繁;*/\
        /* 內(nèi)層檢查是為了確保只在其它線程沒(méi)有搶占鎖完成初始化工作而設(shè)計(jì)。*/           \
        /* 這種做法在Java下是正確的,但是在C++下則沒(méi)有保證。*/                      \
        /* std::once_flag 和 std::call_once:它們內(nèi)部利用互斥量和條件變量組合,*/   \
        /* 實(shí)現(xiàn)這樣的語(yǔ)義。值得一提的是,如果執(zhí)行過(guò)程中拋出異常,標(biāo)準(zhǔn)庫(kù)的設(shè)施不認(rèn)為 */ \
        /* 這是一次「成功的執(zhí)行」。于是其他線程可以繼續(xù)搶占鎖來(lái)執(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 庫(kù)函數(shù) int atexit(void (*func)(void)) 當(dāng)程序正常終止時(shí),調(diào)用指定的*/  \
        /* 函數(shù)func。您可以在任何地方注冊(cè)你的終止函數(shù),*/                           \
        /* 但它會(huì)在程序終止的時(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)                                        

使用方式

注意,如果我們的單例類(lèi)對(duì)象在.hpp文件中那么可能出現(xiàn)重定義的問(wèn)題,博主設(shè)計(jì)的單例模板,只適用于.h和.cpp,即聲明和定義分開(kāi)單例類(lèi)對(duì)象。

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

運(yùn)行結(jié)果:

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

相關(guān)文章

  • 利用C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)小游戲

    利用C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)小游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 基于Matlab實(shí)現(xiàn)鯨魚(yú)優(yōu)化算法的示例代碼

    基于Matlab實(shí)現(xiàn)鯨魚(yú)優(yōu)化算法的示例代碼

    鯨魚(yú)優(yōu)化算法(WOA)是澳大利亞學(xué)者M(jìn)irjaili等于2016年提出的群體智能優(yōu)化算法,根據(jù)座頭鯨的捕獵行為實(shí)現(xiàn)優(yōu)化搜索的目的。本文將利用Matlab實(shí)現(xiàn)這一算法,需要的可以參考一下
    2022-04-04
  • Qt QCompleter自動(dòng)補(bǔ)全的實(shí)現(xiàn)

    Qt QCompleter自動(dòng)補(bǔ)全的實(shí)現(xiàn)

    本文主要介紹了Qt QCompleter自動(dòng)補(bǔ)全的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C 語(yǔ)言簡(jiǎn)單加減乘除運(yùn)算

    C 語(yǔ)言簡(jiǎn)單加減乘除運(yùn)算

    本篇文章主要介紹了C語(yǔ)言的基本運(yùn)算方法,這里對(duì)加法,減法,乘法,除法,求余數(shù),做了詳細(xì)講解,有需要的朋友可以參考下
    2016-07-07
  • 深入理解C++編程中的局部變量和全局變量

    深入理解C++編程中的局部變量和全局變量

    這篇文章主要介紹了深入理解C++編程中的局部變量和全局變量,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++動(dòng)態(tài)數(shù)組類(lèi)的封裝實(shí)例

    C++動(dòng)態(tài)數(shù)組類(lèi)的封裝實(shí)例

    這篇文章主要介紹了C++動(dòng)態(tài)數(shù)組類(lèi)的封裝,很重要的概念,需要的朋友可以參考下
    2014-08-08
  • 解決C語(yǔ)言中使用scanf連續(xù)輸入兩個(gè)字符類(lèi)型的問(wèn)題

    解決C語(yǔ)言中使用scanf連續(xù)輸入兩個(gè)字符類(lèi)型的問(wèn)題

    這篇文章主要介紹了解決C語(yǔ)言中使用scanf連續(xù)輸入兩個(gè)字符類(lèi)型的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • C語(yǔ)言中#if的使用詳解

    C語(yǔ)言中#if的使用詳解

    #if和#endif是一組同時(shí)使用的,叫做條件編譯指令。#if與#define、#include等指令一樣是由預(yù)處理器這個(gè)強(qiáng)大的工具處理的,預(yù)處理器可以在編譯前處理c程序,這篇文章主要介紹了C語(yǔ)言中#if的使用,需要的朋友可以參考下
    2022-11-11
  • C/C++中for語(yǔ)句循環(huán)用法以及練習(xí)舉例

    C/C++中for語(yǔ)句循環(huán)用法以及練習(xí)舉例

    for語(yǔ)句是一種循環(huán)語(yǔ)句,它是對(duì)while語(yǔ)句的推廣,下面這篇文章主要給大家介紹了關(guān)于C/C++中for語(yǔ)句循環(huán)用法以及練習(xí)舉例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 一起來(lái)了解c語(yǔ)言的str函數(shù)

    一起來(lái)了解c語(yǔ)言的str函數(shù)

    這篇文章主要為大家詳細(xì)介紹了c語(yǔ)言的str函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02

最新評(píng)論