单例模式(例子理解)+可变参函数

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

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

posted @ 2015-02-25 22:01  zzyoucan  阅读(247)  评论(0编辑  收藏  举报