单例模式(例子理解)+可变参函数
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; }
对于单例模式多线程访问公共变量需要加锁