码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-25 22:23:11      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

标签:

原文地址:http://www.cnblogs.com/zzyoucan/p/4300313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!