zoukankan      html  css  js  c++  java
  • 单例模式(例子理解)+可变参函数

    class Logger
    {
    public:
        /**
         *@brief 获取Logger实例
         */
        static Logger* Instance()
        {
            if (!ms_pInstance)
                ms_pInstance = new Logger;
            return ms_pInstance;
        }
    
        /**
         *@brief 销毁实例
         */
        static void Destory()
        {
            if (ms_pInstance)
            {
                delete ms_pInstance;
                ms_pInstance = nullptr;
            }
        }
    
        /**
         *@brief Log记录
         */
        void Log(char* pForamt, ...);
    
    private://设置成私有避免外界进行构造和析构
        Logger();
        ~Logger();
    
    private:
        static Logger* ms_pInstance;//Log实例指针
    };
    #include "Logger.h"
    #include <cstdarg>
    #include <iostream>
    #include <string>
    Logger* Logger::ms_pInstance = nullptr;//需要初始化成nullptr,通过值判断其是否被创建
    
    Logger::Logger(){}
    
    Logger::~Logger() {}
    
    //可变参函数理解
    void Logger::Log(char* pForamt, ...)
    {
        /*
        首先在函数里定义一个VA_LIST型的变量,这个变量是指向参数的指针
        */
        va_list vl;
        char szBuffer[2048];
    
        /*
        然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个
        参数是第一个可变参数的前一个参数,是一个固定的参数。(如在运行VA_START
        (ap,v)以后,ap指向第一个可变参数在堆栈的地址
    
        然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
        */
        va_start(vl, pForamt);
    
        /*vsprintf() 中的 arg 参数位于数组中。数组的元素会被插入主字符串的百分比 (%) 符号处。
        该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。*/
        vsprintf(szBuffer, pForamt, vl);
    
        //最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。
        va_end(vl);
        std::cout << szBuffer << std::endl;
    
        //如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
    }
    #include "Logger.h"
    #include <iostream>
    int main()
    {
        //外界不能通过构造和析构
    
        Logger::Instance()->Log("%d.%d", 8, 2);
        Logger::Instance()->Log("%d.%d", 8, 2);
        Logger::Instance()->Log("%d.%d", 8, 2);
    
        Logger::Destory();//实例析构掉
        getchar();
        return 0;
    }

     对于单例模式多线程访问公共变量需要加锁

  • 相关阅读:
    分享Silverlight/WPF/Windows Phone一周学习导读(12月27日1月2日)
    分享Silverlight/WPF/Windows Phone一周学习导读(1月17日1月23日)
    分享Silverlight/WPF/Windows Phone一周学习导读(1月9日1月16日)
    失眠随笔
    Unix编程艺术:多道程序设计
    xm create的过程
    Unix编程艺术:透明性
    创建逻辑卷的过程
    hvm tap vs vif
    xen bootloader
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4300313.html
Copyright © 2011-2022 走看看